From 252840ad40f33518b5efd47a9d2a9c7c8d1514ab Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Mon, 24 Jun 2019 17:37:14 -0700 Subject: [PATCH] Fix incorrect noImplicitAny error on contextual union function signature --- src/compiler/checker.ts | 4 +++- .../functionExpressionContextualTyping3.js | 8 ++++++++ .../functionExpressionContextualTyping3.symbols | 12 ++++++++++++ .../functionExpressionContextualTyping3.types | 13 +++++++++++++ .../functionExpressionContextualTyping3.ts | 5 +++++ 5 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/functionExpressionContextualTyping3.js create mode 100644 tests/baselines/reference/functionExpressionContextualTyping3.symbols create mode 100644 tests/baselines/reference/functionExpressionContextualTyping3.types create mode 100644 tests/cases/conformance/expressions/contextualTyping/functionExpressionContextualTyping3.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a3abe1dc5b5..534e5e2f067 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -19095,7 +19095,9 @@ namespace ts { } } // Result is union of signatures collected (return type is union of return types of this signature set) - return signatureList && createUnionSignature(signatureList[0], signatureList); + if (signatureList) { + return signatureList.length === 1 ? signatureList[0] : createUnionSignature(signatureList[0], signatureList); + } } function checkSpreadExpression(node: SpreadElement, checkMode?: CheckMode): Type { diff --git a/tests/baselines/reference/functionExpressionContextualTyping3.js b/tests/baselines/reference/functionExpressionContextualTyping3.js new file mode 100644 index 00000000000..b25754b568f --- /dev/null +++ b/tests/baselines/reference/functionExpressionContextualTyping3.js @@ -0,0 +1,8 @@ +//// [functionExpressionContextualTyping3.ts] +// #31114 +declare function f(value: T | number): void; +f((a: any) => "") + + +//// [functionExpressionContextualTyping3.js] +f(function (a) { return ""; }); diff --git a/tests/baselines/reference/functionExpressionContextualTyping3.symbols b/tests/baselines/reference/functionExpressionContextualTyping3.symbols new file mode 100644 index 00000000000..8b773f08428 --- /dev/null +++ b/tests/baselines/reference/functionExpressionContextualTyping3.symbols @@ -0,0 +1,12 @@ +=== tests/cases/conformance/expressions/contextualTyping/functionExpressionContextualTyping3.ts === +// #31114 +declare function f(value: T | number): void; +>f : Symbol(f, Decl(functionExpressionContextualTyping3.ts, 0, 0)) +>T : Symbol(T, Decl(functionExpressionContextualTyping3.ts, 1, 19)) +>value : Symbol(value, Decl(functionExpressionContextualTyping3.ts, 1, 22)) +>T : Symbol(T, Decl(functionExpressionContextualTyping3.ts, 1, 19)) + +f((a: any) => "") +>f : Symbol(f, Decl(functionExpressionContextualTyping3.ts, 0, 0)) +>a : Symbol(a, Decl(functionExpressionContextualTyping3.ts, 2, 3)) + diff --git a/tests/baselines/reference/functionExpressionContextualTyping3.types b/tests/baselines/reference/functionExpressionContextualTyping3.types new file mode 100644 index 00000000000..662aa72ea90 --- /dev/null +++ b/tests/baselines/reference/functionExpressionContextualTyping3.types @@ -0,0 +1,13 @@ +=== tests/cases/conformance/expressions/contextualTyping/functionExpressionContextualTyping3.ts === +// #31114 +declare function f(value: T | number): void; +>f : (value: number | T) => void +>value : number | T + +f((a: any) => "") +>f((a: any) => "") : void +>f : (value: number | T) => void +>(a: any) => "" : (a: any) => "" +>a : any +>"" : "" + diff --git a/tests/cases/conformance/expressions/contextualTyping/functionExpressionContextualTyping3.ts b/tests/cases/conformance/expressions/contextualTyping/functionExpressionContextualTyping3.ts new file mode 100644 index 00000000000..a1dc4e5d7d7 --- /dev/null +++ b/tests/cases/conformance/expressions/contextualTyping/functionExpressionContextualTyping3.ts @@ -0,0 +1,5 @@ +// @noImplicitAny: true + +// #31114 +declare function f(value: T | number): void; +f((a: any) => "")