diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 29d5e7901aafb..e4f2b0e6da905 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -19592,8 +19592,18 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return result; } const moreThanOneRealChildren = length(validChildren) > 1; - const arrayLikeTargetParts = filterType(childrenTargetType, isAssignableToAvailableAnyIterable); - const nonArrayLikeTargetParts = filterType(childrenTargetType, t => !isAssignableToAvailableAnyIterable(t)); + let arrayLikeTargetParts: Type; + let nonArrayLikeTargetParts: Type; + const iterableType = getGlobalIterableType(/*reportErrors*/ false); + if (iterableType !== emptyGenericType) { + const anyIterable = createIterableType(anyType); + arrayLikeTargetParts = filterType(childrenTargetType, t => isTypeAssignableTo(t, anyIterable)); + nonArrayLikeTargetParts = filterType(childrenTargetType, t => !isTypeAssignableTo(t, anyIterable)); + } + else { + arrayLikeTargetParts = filterType(childrenTargetType, isArrayOrTupleLikeType); + nonArrayLikeTargetParts = filterType(childrenTargetType, t => !isArrayOrTupleLikeType(t)); + } if (moreThanOneRealChildren) { if (arrayLikeTargetParts !== neverType) { const realSource = createTupleType(checkJsxChildren(containingElement, CheckMode.Normal)); @@ -23116,11 +23126,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return isArrayLikeType(type) || isTupleLikeType(type); } - function isAssignableToAvailableAnyIterable(type: Type): boolean { - const anyIterable = getGlobalIterableType(/*reportErrors*/ false) !== emptyGenericType && createIterableType(anyType); - return anyIterable ? isTypeAssignableTo(type, anyIterable) : isArrayOrTupleLikeType(type); - } - function getTupleElementType(type: Type, index: number) { const propType = getTypeOfPropertyOfType(type, "" + index as __String); if (propType) { @@ -29080,7 +29085,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // type of T. function getContextualTypeForElementExpression(arrayContextualType: Type | undefined, index: number): Type | undefined { return arrayContextualType && ( - index >= 0 && getTypeOfPropertyOfContextualType(filterType(arrayContextualType, t => !!getIndexTypeOfType(t, numberType) || isAssignableToAvailableAnyIterable(t)), "" + index as __String) || + index >= 0 && getTypeOfPropertyOfContextualType(arrayContextualType, "" + index as __String) || mapType(arrayContextualType, t => isTupleType(t) ? getElementTypeOfSliceOfTupleType(t, 0, /*endSkipCount*/ 0, /*writing*/ false, /*noReductions*/ true) : diff --git a/tests/baselines/reference/contextualSignatureInArrayElementLibEs2015.errors.txt b/tests/baselines/reference/contextualSignatureInArrayElementLibEs2015.errors.txt new file mode 100644 index 0000000000000..06b0810c67d3f --- /dev/null +++ b/tests/baselines/reference/contextualSignatureInArrayElementLibEs2015.errors.txt @@ -0,0 +1,18 @@ +tests/cases/compiler/contextualSignatureInArrayElementLibEs2015.ts(8,4): error TS7006: Parameter 'arg' implicitly has an 'any' type. + + +==== tests/cases/compiler/contextualSignatureInArrayElementLibEs2015.ts (1 errors) ==== + // See: https://github.com/microsoft/TypeScript/pull/53280#discussion_r1138684984 + + declare function test( + arg: Record void> | Array<(arg: number) => void> + ): void; + + test([ + (arg) => { + ~~~ +!!! error TS7006: Parameter 'arg' implicitly has an 'any' type. + arg; // number + }, + ]); + \ No newline at end of file diff --git a/tests/baselines/reference/contextualSignatureInArrayElementLibEs2015.symbols b/tests/baselines/reference/contextualSignatureInArrayElementLibEs2015.symbols new file mode 100644 index 0000000000000..6a113aadabfd5 --- /dev/null +++ b/tests/baselines/reference/contextualSignatureInArrayElementLibEs2015.symbols @@ -0,0 +1,27 @@ +=== tests/cases/compiler/contextualSignatureInArrayElementLibEs2015.ts === +// See: https://github.com/microsoft/TypeScript/pull/53280#discussion_r1138684984 + +declare function test( +>test : Symbol(test, Decl(contextualSignatureInArrayElementLibEs2015.ts, 0, 0)) + + arg: Record void> | Array<(arg: number) => void> +>arg : Symbol(arg, Decl(contextualSignatureInArrayElementLibEs2015.ts, 2, 22)) +>Record : Symbol(Record, Decl(lib.es5.d.ts, --, --)) +>arg : Symbol(arg, Decl(contextualSignatureInArrayElementLibEs2015.ts, 3, 23)) +>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) +>arg : Symbol(arg, Decl(contextualSignatureInArrayElementLibEs2015.ts, 3, 54)) + +): void; + +test([ +>test : Symbol(test, Decl(contextualSignatureInArrayElementLibEs2015.ts, 0, 0)) + + (arg) => { +>arg : Symbol(arg, Decl(contextualSignatureInArrayElementLibEs2015.ts, 7, 3)) + + arg; // number +>arg : Symbol(arg, Decl(contextualSignatureInArrayElementLibEs2015.ts, 7, 3)) + + }, +]); + diff --git a/tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.types b/tests/baselines/reference/contextualSignatureInArrayElementLibEs2015.types similarity index 60% rename from tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.types rename to tests/baselines/reference/contextualSignatureInArrayElementLibEs2015.types index 04c1ea69a2789..e6e1945c5536e 100644 --- a/tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.types +++ b/tests/baselines/reference/contextualSignatureInArrayElementLibEs2015.types @@ -1,5 +1,5 @@ -=== tests/cases/compiler/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.ts === -// repro from #52588 +=== tests/cases/compiler/contextualSignatureInArrayElementLibEs2015.ts === +// See: https://github.com/microsoft/TypeScript/pull/53280#discussion_r1138684984 declare function test( >test : (arg: Record void> | ((arg: number) => void)[]) => void @@ -14,14 +14,14 @@ declare function test( test([ >test([ (arg) => { arg; // number },]) : void >test : (arg: Record void> | ((arg: number) => void)[]) => void ->[ (arg) => { arg; // number },] : ((arg: number) => void)[] +>[ (arg) => { arg; // number },] : ((arg: any) => void)[] (arg) => { ->(arg) => { arg; // number } : (arg: number) => void ->arg : number +>(arg) => { arg; // number } : (arg: any) => void +>arg : any arg; // number ->arg : number +>arg : any }, ]); diff --git a/tests/baselines/reference/contextualSignatureInArrayElementLibEs5.errors.txt b/tests/baselines/reference/contextualSignatureInArrayElementLibEs5.errors.txt new file mode 100644 index 0000000000000..a6dd4373f48d7 --- /dev/null +++ b/tests/baselines/reference/contextualSignatureInArrayElementLibEs5.errors.txt @@ -0,0 +1,18 @@ +tests/cases/compiler/contextualSignatureInArrayElementLibEs5.ts(8,4): error TS7006: Parameter 'arg' implicitly has an 'any' type. + + +==== tests/cases/compiler/contextualSignatureInArrayElementLibEs5.ts (1 errors) ==== + // See: https://github.com/microsoft/TypeScript/pull/53280#discussion_r1138684984 + + declare function test( + arg: Record void> | Array<(arg: number) => void> + ): void; + + test([ + (arg) => { + ~~~ +!!! error TS7006: Parameter 'arg' implicitly has an 'any' type. + arg; // number + }, + ]); + \ No newline at end of file diff --git a/tests/baselines/reference/contextualSignatureInArrayElementLibEs5.symbols b/tests/baselines/reference/contextualSignatureInArrayElementLibEs5.symbols new file mode 100644 index 0000000000000..ae547f9d0e234 --- /dev/null +++ b/tests/baselines/reference/contextualSignatureInArrayElementLibEs5.symbols @@ -0,0 +1,27 @@ +=== tests/cases/compiler/contextualSignatureInArrayElementLibEs5.ts === +// See: https://github.com/microsoft/TypeScript/pull/53280#discussion_r1138684984 + +declare function test( +>test : Symbol(test, Decl(contextualSignatureInArrayElementLibEs5.ts, 0, 0)) + + arg: Record void> | Array<(arg: number) => void> +>arg : Symbol(arg, Decl(contextualSignatureInArrayElementLibEs5.ts, 2, 22)) +>Record : Symbol(Record, Decl(lib.es5.d.ts, --, --)) +>arg : Symbol(arg, Decl(contextualSignatureInArrayElementLibEs5.ts, 3, 23)) +>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>arg : Symbol(arg, Decl(contextualSignatureInArrayElementLibEs5.ts, 3, 54)) + +): void; + +test([ +>test : Symbol(test, Decl(contextualSignatureInArrayElementLibEs5.ts, 0, 0)) + + (arg) => { +>arg : Symbol(arg, Decl(contextualSignatureInArrayElementLibEs5.ts, 7, 3)) + + arg; // number +>arg : Symbol(arg, Decl(contextualSignatureInArrayElementLibEs5.ts, 7, 3)) + + }, +]); + diff --git a/tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.types b/tests/baselines/reference/contextualSignatureInArrayElementLibEs5.types similarity index 60% rename from tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.types rename to tests/baselines/reference/contextualSignatureInArrayElementLibEs5.types index c7c6d9c096f61..482e25396852b 100644 --- a/tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.types +++ b/tests/baselines/reference/contextualSignatureInArrayElementLibEs5.types @@ -1,5 +1,5 @@ -=== tests/cases/compiler/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.ts === -// repro from #52588 +=== tests/cases/compiler/contextualSignatureInArrayElementLibEs5.ts === +// See: https://github.com/microsoft/TypeScript/pull/53280#discussion_r1138684984 declare function test( >test : (arg: Record void> | ((arg: number) => void)[]) => void @@ -14,14 +14,14 @@ declare function test( test([ >test([ (arg) => { arg; // number },]) : void >test : (arg: Record void> | ((arg: number) => void)[]) => void ->[ (arg) => { arg; // number },] : ((arg: number) => void)[] +>[ (arg) => { arg; // number },] : ((arg: any) => void)[] (arg) => { ->(arg) => { arg; // number } : (arg: number) => void ->arg : number +>(arg) => { arg; // number } : (arg: any) => void +>arg : any arg; // number ->arg : number +>arg : any }, ]); diff --git a/tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.symbols b/tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.symbols deleted file mode 100644 index b0ff34c16170b..0000000000000 --- a/tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.symbols +++ /dev/null @@ -1,27 +0,0 @@ -=== tests/cases/compiler/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.ts === -// repro from #52588 - -declare function test( ->test : Symbol(test, Decl(contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.ts, 0, 0)) - - arg: Record void> | Array<(arg: number) => void> ->arg : Symbol(arg, Decl(contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.ts, 2, 22)) ->Record : Symbol(Record, Decl(lib.es5.d.ts, --, --)) ->arg : Symbol(arg, Decl(contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.ts, 3, 23)) ->Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) ->arg : Symbol(arg, Decl(contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.ts, 3, 54)) - -): void; - -test([ ->test : Symbol(test, Decl(contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.ts, 0, 0)) - - (arg) => { ->arg : Symbol(arg, Decl(contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.ts, 7, 3)) - - arg; // number ->arg : Symbol(arg, Decl(contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.ts, 7, 3)) - - }, -]); - diff --git a/tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.symbols b/tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.symbols deleted file mode 100644 index cb803d9186e96..0000000000000 --- a/tests/baselines/reference/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.symbols +++ /dev/null @@ -1,27 +0,0 @@ -=== tests/cases/compiler/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.ts === -// repro from #52588 - -declare function test( ->test : Symbol(test, Decl(contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.ts, 0, 0)) - - arg: Record void> | Array<(arg: number) => void> ->arg : Symbol(arg, Decl(contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.ts, 2, 22)) ->Record : Symbol(Record, Decl(lib.es5.d.ts, --, --)) ->arg : Symbol(arg, Decl(contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.ts, 3, 23)) ->Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) ->arg : Symbol(arg, Decl(contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.ts, 3, 54)) - -): void; - -test([ ->test : Symbol(test, Decl(contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.ts, 0, 0)) - - (arg) => { ->arg : Symbol(arg, Decl(contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.ts, 7, 3)) - - arg; // number ->arg : Symbol(arg, Decl(contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.ts, 7, 3)) - - }, -]); - diff --git a/tests/baselines/reference/inferringAnyFunctionType1.js b/tests/baselines/reference/inferringAnyFunctionType1.js index 6b48cf2db5846..f4b598ceefd0f 100644 --- a/tests/baselines/reference/inferringAnyFunctionType1.js +++ b/tests/baselines/reference/inferringAnyFunctionType1.js @@ -3,7 +3,8 @@ function f number }>(p: T): T { return p; } -var v = f([x => x]); +var v = f([x => x]); + //// [inferringAnyFunctionType1.js] function f(p) { diff --git a/tests/cases/compiler/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.ts b/tests/cases/compiler/contextualSignatureInArrayElementLibEs2015.ts similarity index 71% rename from tests/cases/compiler/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.ts rename to tests/cases/compiler/contextualSignatureInArrayElementLibEs2015.ts index ff53d21e895ba..2da7b748ba3b2 100644 --- a/tests/cases/compiler/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs2015.ts +++ b/tests/cases/compiler/contextualSignatureInArrayElementLibEs2015.ts @@ -2,7 +2,7 @@ // @noEmit: true // @lib: es2015 -// repro from #52588 +// See: https://github.com/microsoft/TypeScript/pull/53280#discussion_r1138684984 declare function test( arg: Record void> | Array<(arg: number) => void> diff --git a/tests/cases/compiler/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.ts b/tests/cases/compiler/contextualSignatureInArrayElementLibEs5.ts similarity index 71% rename from tests/cases/compiler/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.ts rename to tests/cases/compiler/contextualSignatureInArrayElementLibEs5.ts index 340bd7690578c..0608fc5b89926 100644 --- a/tests/cases/compiler/contextualSignatureInArrayElementPrefersArrayUnionMemberLibEs5.ts +++ b/tests/cases/compiler/contextualSignatureInArrayElementLibEs5.ts @@ -2,7 +2,7 @@ // @noEmit: true // @lib: es5 -// repro from #52588 +// See: https://github.com/microsoft/TypeScript/pull/53280#discussion_r1138684984 declare function test( arg: Record void> | Array<(arg: number) => void> diff --git a/tests/cases/compiler/inferringAnyFunctionType1.ts b/tests/cases/compiler/inferringAnyFunctionType1.ts index bc1e6f6897339..97418219380bc 100644 --- a/tests/cases/compiler/inferringAnyFunctionType1.ts +++ b/tests/cases/compiler/inferringAnyFunctionType1.ts @@ -1,5 +1,7 @@ +// @lib: es2015 + function f number }>(p: T): T { return p; } -var v = f([x => x]); \ No newline at end of file +var v = f([x => x]);