This commit is contained in:
Jake Bailey
2023-03-16 09:59:02 -07:00
committed by GitHub
parent 7f292bf2a1
commit e0124040f0
13 changed files with 122 additions and 78 deletions

View File

@@ -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) :

View File

@@ -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<string, (arg: string) => void> | Array<(arg: number) => void>
): void;
test([
(arg) => {
~~~
!!! error TS7006: Parameter 'arg' implicitly has an 'any' type.
arg; // number
},
]);

View File

@@ -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<string, (arg: string) => 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))
},
]);

View File

@@ -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<string, (arg: string) => void> | ((arg: number) => void)[]) => void
@@ -14,14 +14,14 @@ declare function test(
test([
>test([ (arg) => { arg; // number },]) : void
>test : (arg: Record<string, (arg: string) => 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
},
]);

View File

@@ -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<string, (arg: string) => void> | Array<(arg: number) => void>
): void;
test([
(arg) => {
~~~
!!! error TS7006: Parameter 'arg' implicitly has an 'any' type.
arg; // number
},
]);

View File

@@ -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<string, (arg: string) => 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))
},
]);

View File

@@ -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<string, (arg: string) => void> | ((arg: number) => void)[]) => void
@@ -14,14 +14,14 @@ declare function test(
test([
>test([ (arg) => { arg; // number },]) : void
>test : (arg: Record<string, (arg: string) => 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
},
]);

View File

@@ -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<string, (arg: string) => 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))
},
]);

View File

@@ -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<string, (arg: string) => 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))
},
]);

View File

@@ -3,7 +3,8 @@ function f<T extends { "0": (p1: number) => number }>(p: T): T {
return p;
}
var v = f([x => x]);
var v = f([x => x]);
//// [inferringAnyFunctionType1.js]
function f(p) {

View File

@@ -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<string, (arg: string) => void> | Array<(arg: number) => void>

View File

@@ -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<string, (arg: string) => void> | Array<(arg: number) => void>

View File

@@ -1,5 +1,7 @@
// @lib: es2015
function f<T extends { "0": (p1: number) => number }>(p: T): T {
return p;
}
var v = f([x => x]);
var v = f([x => x]);