diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5d45af57343..c161dd3f065 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9177,13 +9177,14 @@ namespace ts { } } - function createInferenceContext(signature: Signature, inferUnionTypes: boolean): InferenceContext { + function createInferenceContext(signature: Signature, inferUnionTypes: boolean, useAnyForNoInferences: boolean): InferenceContext { const inferences = map(signature.typeParameters, createTypeInferencesObject); return { signature, inferUnionTypes, inferences, inferredTypes: new Array(signature.typeParameters.length), + useAnyForNoInferences }; } @@ -9613,6 +9614,9 @@ namespace ts { context.inferredTypes[index] = inferredType = instantiatedConstraint; } } + if (context.useAnyForNoInferences && !inferences.length && inferredType === emptyObjectType) { + context.inferredTypes[index] = inferredType = anyType; + } } else if (context.failedTypeParameterIndex === undefined || context.failedTypeParameterIndex > index) { // If inference failed, it is necessary to record the index of the failed type parameter (the one we are on). @@ -13634,7 +13638,7 @@ namespace ts { // Instantiate a generic signature in the context of a non-generic signature (section 3.8.5 in TypeScript spec) function instantiateSignatureInContextOf(signature: Signature, contextualSignature: Signature, contextualMapper: TypeMapper): Signature { - const context = createInferenceContext(signature, /*inferUnionTypes*/ true); + const context = createInferenceContext(signature, /*inferUnionTypes*/ true, /*useAnyForNoInferences*/ false); forEachMatchingParameterType(contextualSignature, signature, (source, target) => { // Type parameters from outer context referenced by source type are fixed by instantiation of the source type inferTypesWithContext(context, instantiateType(source, contextualMapper), target); @@ -14335,7 +14339,7 @@ namespace ts { let candidate: Signature; let typeArgumentsAreValid: boolean; const inferenceContext = originalCandidate.typeParameters - ? createInferenceContext(originalCandidate, /*inferUnionTypes*/ false) + ? createInferenceContext(originalCandidate, /*inferUnionTypes*/ false, /*useAnyForNoInferences*/ isInJavaScriptFile(node)) : undefined; while (true) { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index f96f8623885..de22ae06be3 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -3235,6 +3235,7 @@ mapper?: TypeMapper; // Type mapper for this inference context failedTypeParameterIndex?: number; // Index of type parameter for which inference failed // It is optional because in contextual signature instantiation, nothing fails + useAnyForNoInferences?: boolean; // Use any instead of {} for no inferences } /* @internal */ diff --git a/tests/baselines/reference/inferingFromAny.symbols b/tests/baselines/reference/inferingFromAny.symbols new file mode 100644 index 00000000000..cabb8fb07b7 --- /dev/null +++ b/tests/baselines/reference/inferingFromAny.symbols @@ -0,0 +1,282 @@ +=== tests/cases/conformance/salsa/a.ts === + +var a: any; +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var t: [any, any]; +>t : Symbol(t, Decl(a.ts, 2, 3), Decl(a.js, 2, 3), Decl(a.js, 11, 3), Decl(a.js, 12, 3), Decl(a.js, 13, 3)) + +declare function f1(t: T): T +>f1 : Symbol(f1, Decl(a.ts, 2, 18)) +>T : Symbol(T, Decl(a.ts, 3, 20)) +>t : Symbol(t, Decl(a.ts, 3, 23)) +>T : Symbol(T, Decl(a.ts, 3, 20)) +>T : Symbol(T, Decl(a.ts, 3, 20)) + +declare function f2(t: T[]): T; +>f2 : Symbol(f2, Decl(a.ts, 3, 31)) +>T : Symbol(T, Decl(a.ts, 4, 20)) +>t : Symbol(t, Decl(a.ts, 4, 23)) +>T : Symbol(T, Decl(a.ts, 4, 20)) +>T : Symbol(T, Decl(a.ts, 4, 20)) + +declare function f3(t: [T, U]): [T, U]; +>f3 : Symbol(f3, Decl(a.ts, 4, 34)) +>T : Symbol(T, Decl(a.ts, 5, 20)) +>U : Symbol(U, Decl(a.ts, 5, 22)) +>t : Symbol(t, Decl(a.ts, 5, 26)) +>T : Symbol(T, Decl(a.ts, 5, 20)) +>U : Symbol(U, Decl(a.ts, 5, 22)) +>T : Symbol(T, Decl(a.ts, 5, 20)) +>U : Symbol(U, Decl(a.ts, 5, 22)) + +declare function f4(x: { bar: T; baz: T }): T; +>f4 : Symbol(f4, Decl(a.ts, 5, 45)) +>T : Symbol(T, Decl(a.ts, 6, 20)) +>x : Symbol(x, Decl(a.ts, 6, 23)) +>bar : Symbol(bar, Decl(a.ts, 6, 27)) +>T : Symbol(T, Decl(a.ts, 6, 20)) +>baz : Symbol(baz, Decl(a.ts, 6, 35)) +>T : Symbol(T, Decl(a.ts, 6, 20)) +>T : Symbol(T, Decl(a.ts, 6, 20)) + +declare function f5(x: (a: T) => void): T; +>f5 : Symbol(f5, Decl(a.ts, 6, 49)) +>T : Symbol(T, Decl(a.ts, 7, 20)) +>x : Symbol(x, Decl(a.ts, 7, 23)) +>a : Symbol(a, Decl(a.ts, 7, 27)) +>T : Symbol(T, Decl(a.ts, 7, 20)) +>T : Symbol(T, Decl(a.ts, 7, 20)) + +declare function f6(x: new (a: T) => {}): T; +>f6 : Symbol(f6, Decl(a.ts, 7, 45)) +>T : Symbol(T, Decl(a.ts, 8, 20)) +>x : Symbol(x, Decl(a.ts, 8, 23)) +>a : Symbol(a, Decl(a.ts, 8, 31)) +>T : Symbol(T, Decl(a.ts, 8, 20)) +>T : Symbol(T, Decl(a.ts, 8, 20)) + +declare function f7(x: (a: any) => a is T): T; +>f7 : Symbol(f7, Decl(a.ts, 8, 47)) +>T : Symbol(T, Decl(a.ts, 9, 20)) +>x : Symbol(x, Decl(a.ts, 9, 23)) +>a : Symbol(a, Decl(a.ts, 9, 27)) +>a : Symbol(a, Decl(a.ts, 9, 27)) +>T : Symbol(T, Decl(a.ts, 9, 20)) +>T : Symbol(T, Decl(a.ts, 9, 20)) + +declare function f8(x: () => T): T; +>f8 : Symbol(f8, Decl(a.ts, 9, 49)) +>T : Symbol(T, Decl(a.ts, 10, 20)) +>x : Symbol(x, Decl(a.ts, 10, 23)) +>T : Symbol(T, Decl(a.ts, 10, 20)) +>T : Symbol(T, Decl(a.ts, 10, 20)) + +declare function f9(x: new () => T): T; +>f9 : Symbol(f9, Decl(a.ts, 10, 38)) +>T : Symbol(T, Decl(a.ts, 11, 20)) +>x : Symbol(x, Decl(a.ts, 11, 23)) +>T : Symbol(T, Decl(a.ts, 11, 20)) +>T : Symbol(T, Decl(a.ts, 11, 20)) + +declare function f10(x: { [x: string]: T }): T; +>f10 : Symbol(f10, Decl(a.ts, 11, 42)) +>T : Symbol(T, Decl(a.ts, 12, 21)) +>x : Symbol(x, Decl(a.ts, 12, 24)) +>x : Symbol(x, Decl(a.ts, 12, 30)) +>T : Symbol(T, Decl(a.ts, 12, 21)) +>T : Symbol(T, Decl(a.ts, 12, 21)) + +declare function f11(x: { [x: number]: T }): T; +>f11 : Symbol(f11, Decl(a.ts, 12, 50)) +>T : Symbol(T, Decl(a.ts, 13, 21)) +>x : Symbol(x, Decl(a.ts, 13, 24)) +>x : Symbol(x, Decl(a.ts, 13, 30)) +>T : Symbol(T, Decl(a.ts, 13, 21)) +>T : Symbol(T, Decl(a.ts, 13, 21)) + +declare function f12(x: T | U): [T, U]; +>f12 : Symbol(f12, Decl(a.ts, 13, 50)) +>T : Symbol(T, Decl(a.ts, 14, 21)) +>U : Symbol(U, Decl(a.ts, 14, 23)) +>x : Symbol(x, Decl(a.ts, 14, 27)) +>T : Symbol(T, Decl(a.ts, 14, 21)) +>U : Symbol(U, Decl(a.ts, 14, 23)) +>T : Symbol(T, Decl(a.ts, 14, 21)) +>U : Symbol(U, Decl(a.ts, 14, 23)) + +declare function f13(x: T & U): [T, U]; +>f13 : Symbol(f13, Decl(a.ts, 14, 45)) +>T : Symbol(T, Decl(a.ts, 15, 21)) +>U : Symbol(U, Decl(a.ts, 15, 23)) +>x : Symbol(x, Decl(a.ts, 15, 27)) +>T : Symbol(T, Decl(a.ts, 15, 21)) +>U : Symbol(U, Decl(a.ts, 15, 23)) +>T : Symbol(T, Decl(a.ts, 15, 21)) +>U : Symbol(U, Decl(a.ts, 15, 23)) + +declare function f14(x: { a: T | U, b: U & T }): [T, U]; +>f14 : Symbol(f14, Decl(a.ts, 15, 45)) +>T : Symbol(T, Decl(a.ts, 16, 21)) +>U : Symbol(U, Decl(a.ts, 16, 23)) +>x : Symbol(x, Decl(a.ts, 16, 27)) +>a : Symbol(a, Decl(a.ts, 16, 31)) +>T : Symbol(T, Decl(a.ts, 16, 21)) +>U : Symbol(U, Decl(a.ts, 16, 23)) +>b : Symbol(b, Decl(a.ts, 16, 41)) +>U : Symbol(U, Decl(a.ts, 16, 23)) +>T : Symbol(T, Decl(a.ts, 16, 21)) +>T : Symbol(T, Decl(a.ts, 16, 21)) +>U : Symbol(U, Decl(a.ts, 16, 23)) + +interface I { } +>I : Symbol(I, Decl(a.ts, 16, 62)) +>T : Symbol(T, Decl(a.ts, 17, 12)) + +declare function f15(x: I): T; +>f15 : Symbol(f15, Decl(a.ts, 17, 18)) +>T : Symbol(T, Decl(a.ts, 18, 21)) +>x : Symbol(x, Decl(a.ts, 18, 24)) +>I : Symbol(I, Decl(a.ts, 16, 62)) +>T : Symbol(T, Decl(a.ts, 18, 21)) +>T : Symbol(T, Decl(a.ts, 18, 21)) + +declare function f16(x: Partial): T; +>f16 : Symbol(f16, Decl(a.ts, 18, 36)) +>T : Symbol(T, Decl(a.ts, 19, 21)) +>x : Symbol(x, Decl(a.ts, 19, 24)) +>Partial : Symbol(Partial, Decl(lib.d.ts, --, --)) +>T : Symbol(T, Decl(a.ts, 19, 21)) +>T : Symbol(T, Decl(a.ts, 19, 21)) + +declare function f17(x: {[P in keyof T]: K}): T; +>f17 : Symbol(f17, Decl(a.ts, 19, 42)) +>T : Symbol(T, Decl(a.ts, 20, 21)) +>K : Symbol(K, Decl(a.ts, 20, 23)) +>x : Symbol(x, Decl(a.ts, 20, 27)) +>P : Symbol(P, Decl(a.ts, 20, 32)) +>T : Symbol(T, Decl(a.ts, 20, 21)) +>K : Symbol(K, Decl(a.ts, 20, 23)) +>T : Symbol(T, Decl(a.ts, 20, 21)) + +declare function f18(x: {[P in K]: T[P]}): T; +>f18 : Symbol(f18, Decl(a.ts, 20, 54)) +>T : Symbol(T, Decl(a.ts, 21, 21)) +>K : Symbol(K, Decl(a.ts, 21, 23)) +>T : Symbol(T, Decl(a.ts, 21, 21)) +>x : Symbol(x, Decl(a.ts, 21, 43)) +>P : Symbol(P, Decl(a.ts, 21, 48)) +>K : Symbol(K, Decl(a.ts, 21, 23)) +>T : Symbol(T, Decl(a.ts, 21, 21)) +>P : Symbol(P, Decl(a.ts, 21, 48)) +>T : Symbol(T, Decl(a.ts, 21, 21)) + +declare function f19(k: K, x: T[K]): T; +>f19 : Symbol(f19, Decl(a.ts, 21, 67)) +>T : Symbol(T, Decl(a.ts, 22, 21)) +>K : Symbol(K, Decl(a.ts, 22, 23)) +>T : Symbol(T, Decl(a.ts, 22, 21)) +>k : Symbol(k, Decl(a.ts, 22, 43)) +>K : Symbol(K, Decl(a.ts, 22, 23)) +>x : Symbol(x, Decl(a.ts, 22, 48)) +>T : Symbol(T, Decl(a.ts, 22, 21)) +>K : Symbol(K, Decl(a.ts, 22, 23)) +>T : Symbol(T, Decl(a.ts, 22, 21)) + +=== tests/cases/conformance/salsa/a.js === +var a = f1(a); +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>f1 : Symbol(f1, Decl(a.ts, 2, 18)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var a = f2(a); +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>f2 : Symbol(f2, Decl(a.ts, 3, 31)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var t = f3(a); +>t : Symbol(t, Decl(a.ts, 2, 3), Decl(a.js, 2, 3), Decl(a.js, 11, 3), Decl(a.js, 12, 3), Decl(a.js, 13, 3)) +>f3 : Symbol(f3, Decl(a.ts, 4, 34)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var a = f4(a); +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>f4 : Symbol(f4, Decl(a.ts, 5, 45)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var a = f5(a); +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>f5 : Symbol(f5, Decl(a.ts, 6, 49)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var a = f6(a); +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>f6 : Symbol(f6, Decl(a.ts, 7, 45)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var a = f7(a); +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>f7 : Symbol(f7, Decl(a.ts, 8, 47)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var a = f8(a); +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>f8 : Symbol(f8, Decl(a.ts, 9, 49)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var a = f9(a); +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>f9 : Symbol(f9, Decl(a.ts, 10, 38)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var a = f10(a); +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>f10 : Symbol(f10, Decl(a.ts, 11, 42)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var a = f11(a); +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>f11 : Symbol(f11, Decl(a.ts, 12, 50)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var t = f12(a); +>t : Symbol(t, Decl(a.ts, 2, 3), Decl(a.js, 2, 3), Decl(a.js, 11, 3), Decl(a.js, 12, 3), Decl(a.js, 13, 3)) +>f12 : Symbol(f12, Decl(a.ts, 13, 50)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var t = f13(a); +>t : Symbol(t, Decl(a.ts, 2, 3), Decl(a.js, 2, 3), Decl(a.js, 11, 3), Decl(a.js, 12, 3), Decl(a.js, 13, 3)) +>f13 : Symbol(f13, Decl(a.ts, 14, 45)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var t = f14(a); +>t : Symbol(t, Decl(a.ts, 2, 3), Decl(a.js, 2, 3), Decl(a.js, 11, 3), Decl(a.js, 12, 3), Decl(a.js, 13, 3)) +>f14 : Symbol(f14, Decl(a.ts, 15, 45)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var a = f15(a); +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>f15 : Symbol(f15, Decl(a.ts, 17, 18)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var a = f16(a); +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>f16 : Symbol(f16, Decl(a.ts, 18, 36)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var a = f17(a); +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>f17 : Symbol(f17, Decl(a.ts, 19, 42)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var a = f18(a); +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>f18 : Symbol(f18, Decl(a.ts, 20, 54)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + +var a = f19(a, a); +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>f19 : Symbol(f19, Decl(a.ts, 21, 67)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) +>a : Symbol(a, Decl(a.ts, 1, 3), Decl(a.js, 0, 3), Decl(a.js, 1, 3), Decl(a.js, 3, 3), Decl(a.js, 4, 3), Decl(a.js, 5, 3), Decl(a.js, 6, 3), Decl(a.js, 7, 3), Decl(a.js, 8, 3), Decl(a.js, 9, 3), Decl(a.js, 10, 3), Decl(a.js, 14, 3), Decl(a.js, 15, 3), Decl(a.js, 16, 3), Decl(a.js, 17, 3), Decl(a.js, 18, 3)) + diff --git a/tests/baselines/reference/inferingFromAny.types b/tests/baselines/reference/inferingFromAny.types new file mode 100644 index 00000000000..c991f12f45c --- /dev/null +++ b/tests/baselines/reference/inferingFromAny.types @@ -0,0 +1,301 @@ +=== tests/cases/conformance/salsa/a.ts === + +var a: any; +>a : any + +var t: [any, any]; +>t : [any, any] + +declare function f1(t: T): T +>f1 : (t: T) => T +>T : T +>t : T +>T : T +>T : T + +declare function f2(t: T[]): T; +>f2 : (t: T[]) => T +>T : T +>t : T[] +>T : T +>T : T + +declare function f3(t: [T, U]): [T, U]; +>f3 : (t: [T, U]) => [T, U] +>T : T +>U : U +>t : [T, U] +>T : T +>U : U +>T : T +>U : U + +declare function f4(x: { bar: T; baz: T }): T; +>f4 : (x: { bar: T; baz: T; }) => T +>T : T +>x : { bar: T; baz: T; } +>bar : T +>T : T +>baz : T +>T : T +>T : T + +declare function f5(x: (a: T) => void): T; +>f5 : (x: (a: T) => void) => T +>T : T +>x : (a: T) => void +>a : T +>T : T +>T : T + +declare function f6(x: new (a: T) => {}): T; +>f6 : (x: new (a: T) => {}) => T +>T : T +>x : new (a: T) => {} +>a : T +>T : T +>T : T + +declare function f7(x: (a: any) => a is T): T; +>f7 : (x: (a: any) => a is T) => T +>T : T +>x : (a: any) => a is T +>a : any +>a : any +>T : T +>T : T + +declare function f8(x: () => T): T; +>f8 : (x: () => T) => T +>T : T +>x : () => T +>T : T +>T : T + +declare function f9(x: new () => T): T; +>f9 : (x: new () => T) => T +>T : T +>x : new () => T +>T : T +>T : T + +declare function f10(x: { [x: string]: T }): T; +>f10 : (x: { [x: string]: T; }) => T +>T : T +>x : { [x: string]: T; } +>x : string +>T : T +>T : T + +declare function f11(x: { [x: number]: T }): T; +>f11 : (x: { [x: number]: T; }) => T +>T : T +>x : { [x: number]: T; } +>x : number +>T : T +>T : T + +declare function f12(x: T | U): [T, U]; +>f12 : (x: T | U) => [T, U] +>T : T +>U : U +>x : T | U +>T : T +>U : U +>T : T +>U : U + +declare function f13(x: T & U): [T, U]; +>f13 : (x: T & U) => [T, U] +>T : T +>U : U +>x : T & U +>T : T +>U : U +>T : T +>U : U + +declare function f14(x: { a: T | U, b: U & T }): [T, U]; +>f14 : (x: { a: T | U; b: U & T; }) => [T, U] +>T : T +>U : U +>x : { a: T | U; b: U & T; } +>a : T | U +>T : T +>U : U +>b : U & T +>U : U +>T : T +>T : T +>U : U + +interface I { } +>I : I +>T : T + +declare function f15(x: I): T; +>f15 : (x: I) => T +>T : T +>x : I +>I : I +>T : T +>T : T + +declare function f16(x: Partial): T; +>f16 : (x: Partial) => T +>T : T +>x : Partial +>Partial : Partial +>T : T +>T : T + +declare function f17(x: {[P in keyof T]: K}): T; +>f17 : (x: { [P in keyof T]: K; }) => T +>T : T +>K : K +>x : { [P in keyof T]: K; } +>P : P +>T : T +>K : K +>T : T + +declare function f18(x: {[P in K]: T[P]}): T; +>f18 : (x: { [P in K]: T[P]; }) => T +>T : T +>K : K +>T : T +>x : { [P in K]: T[P]; } +>P : P +>K : K +>T : T +>P : P +>T : T + +declare function f19(k: K, x: T[K]): T; +>f19 : (k: K, x: T[K]) => T +>T : T +>K : K +>T : T +>k : K +>K : K +>x : T[K] +>T : T +>K : K +>T : T + +=== tests/cases/conformance/salsa/a.js === +var a = f1(a); +>a : any +>f1(a) : any +>f1 : (t: T) => T +>a : any + +var a = f2(a); +>a : any +>f2(a) : any +>f2 : (t: T[]) => T +>a : any + +var t = f3(a); +>t : [any, any] +>f3(a) : [any, any] +>f3 : (t: [T, U]) => [T, U] +>a : any + +var a = f4(a); +>a : any +>f4(a) : any +>f4 : (x: { bar: T; baz: T; }) => T +>a : any + +var a = f5(a); +>a : any +>f5(a) : any +>f5 : (x: (a: T) => void) => T +>a : any + +var a = f6(a); +>a : any +>f6(a) : any +>f6 : (x: new (a: T) => {}) => T +>a : any + +var a = f7(a); +>a : any +>f7(a) : any +>f7 : (x: (a: any) => a is T) => T +>a : any + +var a = f8(a); +>a : any +>f8(a) : any +>f8 : (x: () => T) => T +>a : any + +var a = f9(a); +>a : any +>f9(a) : any +>f9 : (x: new () => T) => T +>a : any + +var a = f10(a); +>a : any +>f10(a) : any +>f10 : (x: { [x: string]: T; }) => T +>a : any + +var a = f11(a); +>a : any +>f11(a) : any +>f11 : (x: { [x: number]: T; }) => T +>a : any + +var t = f12(a); +>t : [any, any] +>f12(a) : [any, any] +>f12 : (x: T | U) => [T, U] +>a : any + +var t = f13(a); +>t : [any, any] +>f13(a) : [any, any] +>f13 : (x: T & U) => [T, U] +>a : any + +var t = f14(a); +>t : [any, any] +>f14(a) : [any, any] +>f14 : (x: { a: T | U; b: U & T; }) => [T, U] +>a : any + +var a = f15(a); +>a : any +>f15(a) : any +>f15 : (x: I) => T +>a : any + +var a = f16(a); +>a : any +>f16(a) : any +>f16 : (x: Partial) => T +>a : any + +var a = f17(a); +>a : any +>f17(a) : any +>f17 : (x: { [P in keyof T]: K; }) => T +>a : any + +var a = f18(a); +>a : any +>f18(a) : any +>f18 : (x: { [P in K]: T[P]; }) => T +>a : any + +var a = f19(a, a); +>a : any +>f19(a, a) : any +>f19 : (k: K, x: T[K]) => T +>a : any +>a : any + diff --git a/tests/cases/conformance/salsa/inferingFromAny.ts b/tests/cases/conformance/salsa/inferingFromAny.ts new file mode 100644 index 00000000000..60519b2a5b6 --- /dev/null +++ b/tests/cases/conformance/salsa/inferingFromAny.ts @@ -0,0 +1,47 @@ +// @allowJs: true +// @noEmit: true + +// @fileName: a.ts +var a: any; +var t: [any, any]; +declare function f1(t: T): T +declare function f2(t: T[]): T; +declare function f3(t: [T, U]): [T, U]; +declare function f4(x: { bar: T; baz: T }): T; +declare function f5(x: (a: T) => void): T; +declare function f6(x: new (a: T) => {}): T; +declare function f7(x: (a: any) => a is T): T; +declare function f8(x: () => T): T; +declare function f9(x: new () => T): T; +declare function f10(x: { [x: string]: T }): T; +declare function f11(x: { [x: number]: T }): T; +declare function f12(x: T | U): [T, U]; +declare function f13(x: T & U): [T, U]; +declare function f14(x: { a: T | U, b: U & T }): [T, U]; +interface I { } +declare function f15(x: I): T; +declare function f16(x: Partial): T; +declare function f17(x: {[P in keyof T]: K}): T; +declare function f18(x: {[P in K]: T[P]}): T; +declare function f19(k: K, x: T[K]): T; + +// @fileName: a.js +var a = f1(a); +var a = f2(a); +var t = f3(a); +var a = f4(a); +var a = f5(a); +var a = f6(a); +var a = f7(a); +var a = f8(a); +var a = f9(a); +var a = f10(a); +var a = f11(a); +var t = f12(a); +var t = f13(a); +var t = f14(a); +var a = f15(a); +var a = f16(a); +var a = f17(a); +var a = f18(a); +var a = f19(a, a); \ No newline at end of file