Skip to content

Commit b87ac31

Browse files
committed
Revert "Filter out non-array types when contextually typing array literal elements (microsoft#52589)"
This reverts commit e775383.
1 parent f03e62d commit b87ac31

10 files changed

+13
-297
lines changed

src/compiler/checker.ts

+13-8
Original file line numberDiff line numberDiff line change
@@ -19592,8 +19592,18 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1959219592
return result;
1959319593
}
1959419594
const moreThanOneRealChildren = length(validChildren) > 1;
19595-
const arrayLikeTargetParts = filterType(childrenTargetType, isAssignableToAvailableAnyIterable);
19596-
const nonArrayLikeTargetParts = filterType(childrenTargetType, t => !isAssignableToAvailableAnyIterable(t));
19595+
let arrayLikeTargetParts: Type;
19596+
let nonArrayLikeTargetParts: Type;
19597+
const iterableType = getGlobalIterableType(/*reportErrors*/ false);
19598+
if (iterableType !== emptyGenericType) {
19599+
const anyIterable = createIterableType(anyType);
19600+
arrayLikeTargetParts = filterType(childrenTargetType, t => isTypeAssignableTo(t, anyIterable));
19601+
nonArrayLikeTargetParts = filterType(childrenTargetType, t => !isTypeAssignableTo(t, anyIterable));
19602+
}
19603+
else {
19604+
arrayLikeTargetParts = filterType(childrenTargetType, isArrayOrTupleLikeType);
19605+
nonArrayLikeTargetParts = filterType(childrenTargetType, t => !isArrayOrTupleLikeType(t));
19606+
}
1959719607
if (moreThanOneRealChildren) {
1959819608
if (arrayLikeTargetParts !== neverType) {
1959919609
const realSource = createTupleType(checkJsxChildren(containingElement, CheckMode.Normal));
@@ -23116,11 +23126,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2311623126
return isArrayLikeType(type) || isTupleLikeType(type);
2311723127
}
2311823128

23119-
function isAssignableToAvailableAnyIterable(type: Type): boolean {
23120-
const anyIterable = getGlobalIterableType(/*reportErrors*/ false) !== emptyGenericType && createIterableType(anyType);
23121-
return anyIterable ? isTypeAssignableTo(type, anyIterable) : isArrayOrTupleLikeType(type);
23122-
}
23123-
2312423129
function getTupleElementType(type: Type, index: number) {
2312523130
const propType = getTypeOfPropertyOfType(type, "" + index as __String);
2312623131
if (propType) {
@@ -29080,7 +29085,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2908029085
// type of T.
2908129086
function getContextualTypeForElementExpression(arrayContextualType: Type | undefined, index: number): Type | undefined {
2908229087
return arrayContextualType && (
29083-
index >= 0 && getTypeOfPropertyOfContextualType(filterType(arrayContextualType, t => !!getIndexTypeOfType(t, numberType) || isAssignableToAvailableAnyIterable(t)), "" + index as __String) ||
29088+
index >= 0 && getTypeOfPropertyOfContextualType(arrayContextualType, "" + index as __String) ||
2908429089
mapType(arrayContextualType, t =>
2908529090
isTupleType(t) ?
2908629091
getElementTypeOfSliceOfTupleType(t, 0, /*endSkipCount*/ 0, /*writing*/ false, /*noReductions*/ true) :

tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.symbols

-27
This file was deleted.

tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.types

-28
This file was deleted.

tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.symbols

-27
This file was deleted.

tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.types

-28
This file was deleted.

tests/baselines/reference/contextualTypeCaching.symbols

-67
Original file line numberDiff line numberDiff line change
@@ -60,70 +60,3 @@ emit('a', {
6060
},
6161
});
6262

63-
// simplified repro from 52589#issuecomment-1416180638
64-
declare class MyCompiler {
65-
>MyCompiler : Symbol(MyCompiler, Decl(contextualTypeCaching.ts, 21, 3))
66-
67-
compile(): void;
68-
>compile : Symbol(MyCompiler.compile, Decl(contextualTypeCaching.ts, 24, 26))
69-
}
70-
interface WebpackPluginInstance {
71-
>WebpackPluginInstance : Symbol(WebpackPluginInstance, Decl(contextualTypeCaching.ts, 26, 1))
72-
73-
apply: (compiler: MyCompiler) => void;
74-
>apply : Symbol(WebpackPluginInstance.apply, Decl(contextualTypeCaching.ts, 27, 33))
75-
>compiler : Symbol(compiler, Decl(contextualTypeCaching.ts, 28, 10))
76-
>MyCompiler : Symbol(MyCompiler, Decl(contextualTypeCaching.ts, 21, 3))
77-
}
78-
type WebpackPluginFunction = (this: MyCompiler, compiler: MyCompiler) => void;
79-
>WebpackPluginFunction : Symbol(WebpackPluginFunction, Decl(contextualTypeCaching.ts, 29, 1))
80-
>this : Symbol(this, Decl(contextualTypeCaching.ts, 30, 30))
81-
>MyCompiler : Symbol(MyCompiler, Decl(contextualTypeCaching.ts, 21, 3))
82-
>compiler : Symbol(compiler, Decl(contextualTypeCaching.ts, 30, 47))
83-
>MyCompiler : Symbol(MyCompiler, Decl(contextualTypeCaching.ts, 21, 3))
84-
85-
interface Optimization {
86-
>Optimization : Symbol(Optimization, Decl(contextualTypeCaching.ts, 30, 78))
87-
88-
minimizer?: (WebpackPluginInstance | WebpackPluginFunction)[];
89-
>minimizer : Symbol(Optimization.minimizer, Decl(contextualTypeCaching.ts, 31, 24))
90-
>WebpackPluginInstance : Symbol(WebpackPluginInstance, Decl(contextualTypeCaching.ts, 26, 1))
91-
>WebpackPluginFunction : Symbol(WebpackPluginFunction, Decl(contextualTypeCaching.ts, 29, 1))
92-
}
93-
declare const A: <T, P extends keyof T>(
94-
>A : Symbol(A, Decl(contextualTypeCaching.ts, 34, 13))
95-
>T : Symbol(T, Decl(contextualTypeCaching.ts, 34, 18))
96-
>P : Symbol(P, Decl(contextualTypeCaching.ts, 34, 20))
97-
>T : Symbol(T, Decl(contextualTypeCaching.ts, 34, 18))
98-
99-
obj: T,
100-
>obj : Symbol(obj, Decl(contextualTypeCaching.ts, 34, 40))
101-
>T : Symbol(T, Decl(contextualTypeCaching.ts, 34, 18))
102-
103-
prop: P,
104-
>prop : Symbol(prop, Decl(contextualTypeCaching.ts, 35, 9))
105-
>P : Symbol(P, Decl(contextualTypeCaching.ts, 34, 20))
106-
107-
factory: () => T[P]
108-
>factory : Symbol(factory, Decl(contextualTypeCaching.ts, 36, 10))
109-
>T : Symbol(T, Decl(contextualTypeCaching.ts, 34, 18))
110-
>P : Symbol(P, Decl(contextualTypeCaching.ts, 34, 20))
111-
112-
) => void;
113-
export const applyOptimizationDefaults = (optimization: Optimization) => {
114-
>applyOptimizationDefaults : Symbol(applyOptimizationDefaults, Decl(contextualTypeCaching.ts, 39, 12))
115-
>optimization : Symbol(optimization, Decl(contextualTypeCaching.ts, 39, 42))
116-
>Optimization : Symbol(Optimization, Decl(contextualTypeCaching.ts, 30, 78))
117-
118-
A(optimization, "minimizer", () => [
119-
>A : Symbol(A, Decl(contextualTypeCaching.ts, 34, 13))
120-
>optimization : Symbol(optimization, Decl(contextualTypeCaching.ts, 39, 42))
121-
{
122-
apply: (compiler) => {},
123-
>apply : Symbol(apply, Decl(contextualTypeCaching.ts, 41, 5))
124-
>compiler : Symbol(compiler, Decl(contextualTypeCaching.ts, 42, 14))
125-
126-
},
127-
]);
128-
};
129-

tests/baselines/reference/contextualTypeCaching.types

-58
Original file line numberDiff line numberDiff line change
@@ -54,61 +54,3 @@ emit('a', {
5454
},
5555
});
5656

57-
// simplified repro from 52589#issuecomment-1416180638
58-
declare class MyCompiler {
59-
>MyCompiler : MyCompiler
60-
61-
compile(): void;
62-
>compile : () => void
63-
}
64-
interface WebpackPluginInstance {
65-
apply: (compiler: MyCompiler) => void;
66-
>apply : (compiler: MyCompiler) => void
67-
>compiler : MyCompiler
68-
}
69-
type WebpackPluginFunction = (this: MyCompiler, compiler: MyCompiler) => void;
70-
>WebpackPluginFunction : (this: MyCompiler, compiler: MyCompiler) => void
71-
>this : MyCompiler
72-
>compiler : MyCompiler
73-
74-
interface Optimization {
75-
minimizer?: (WebpackPluginInstance | WebpackPluginFunction)[];
76-
>minimizer : (WebpackPluginInstance | WebpackPluginFunction)[] | undefined
77-
}
78-
declare const A: <T, P extends keyof T>(
79-
>A : <T, P extends keyof T>(obj: T, prop: P, factory: () => T[P]) => void
80-
81-
obj: T,
82-
>obj : T
83-
84-
prop: P,
85-
>prop : P
86-
87-
factory: () => T[P]
88-
>factory : () => T[P]
89-
90-
) => void;
91-
export const applyOptimizationDefaults = (optimization: Optimization) => {
92-
>applyOptimizationDefaults : (optimization: Optimization) => void
93-
>(optimization: Optimization) => { A(optimization, "minimizer", () => [ { apply: (compiler) => {}, }, ]);} : (optimization: Optimization) => void
94-
>optimization : Optimization
95-
96-
A(optimization, "minimizer", () => [
97-
>A(optimization, "minimizer", () => [ { apply: (compiler) => {}, }, ]) : void
98-
>A : <T, P extends keyof T>(obj: T, prop: P, factory: () => T[P]) => void
99-
>optimization : Optimization
100-
>"minimizer" : "minimizer"
101-
>() => [ { apply: (compiler) => {}, }, ] : () => { apply: (compiler: MyCompiler) => void; }[]
102-
>[ { apply: (compiler) => {}, }, ] : { apply: (compiler: MyCompiler) => void; }[]
103-
{
104-
>{ apply: (compiler) => {}, } : { apply: (compiler: MyCompiler) => void; }
105-
106-
apply: (compiler) => {},
107-
>apply : (compiler: MyCompiler) => void
108-
>(compiler) => {} : (compiler: MyCompiler) => void
109-
>compiler : MyCompiler
110-
111-
},
112-
]);
113-
};
114-

tests/cases/compiler/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.ts

-15
This file was deleted.

tests/cases/compiler/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.ts

-15
This file was deleted.

tests/cases/compiler/contextualTypeCaching.ts

-24
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,3 @@ emit('a', {
2323
nestedCallback: (r) => {},
2424
},
2525
});
26-
27-
// simplified repro from 52589#issuecomment-1416180638
28-
declare class MyCompiler {
29-
compile(): void;
30-
}
31-
interface WebpackPluginInstance {
32-
apply: (compiler: MyCompiler) => void;
33-
}
34-
type WebpackPluginFunction = (this: MyCompiler, compiler: MyCompiler) => void;
35-
interface Optimization {
36-
minimizer?: (WebpackPluginInstance | WebpackPluginFunction)[];
37-
}
38-
declare const A: <T, P extends keyof T>(
39-
obj: T,
40-
prop: P,
41-
factory: () => T[P]
42-
) => void;
43-
export const applyOptimizationDefaults = (optimization: Optimization) => {
44-
A(optimization, "minimizer", () => [
45-
{
46-
apply: (compiler) => {},
47-
},
48-
]);
49-
};

0 commit comments

Comments
 (0)