From 0a628ff0c9c0bd6ef169a28e7052450939b625ec Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Sat, 6 Nov 2021 00:36:08 +0200 Subject: [PATCH] fix(44059): omit duplicate types (#45739) --- src/services/codefixes/inferFromUsage.ts | 18 +++++++++++++++--- .../codeFixInferFromUsageVariable4.ts | 13 +++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 tests/cases/fourslash/codeFixInferFromUsageVariable4.ts diff --git a/src/services/codefixes/inferFromUsage.ts b/src/services/codefixes/inferFromUsage.ts index b6b3aea3f02..e680d4307ec 100644 --- a/src/services/codefixes/inferFromUsage.ts +++ b/src/services/codefixes/inferFromUsage.ts @@ -1000,13 +1000,25 @@ namespace ts.codefix { if (usage.numberIndex) { types.push(checker.createArrayType(combineFromUsage(usage.numberIndex))); } - if (usage.properties?.size || usage.calls?.length || usage.constructs?.length || usage.stringIndex) { + if (usage.properties?.size || usage.constructs?.length || usage.stringIndex) { types.push(inferStructuralType(usage)); } - types.push(...(usage.candidateTypes || []).map(t => checker.getBaseTypeOfLiteralType(t))); - types.push(...inferNamedTypesFromProperties(usage)); + const candidateTypes = (usage.candidateTypes || []).map(t => checker.getBaseTypeOfLiteralType(t)); + const callsType = usage.calls?.length ? inferStructuralType(usage) : undefined; + if (callsType && candidateTypes) { + types.push(checker.getUnionType([callsType, ...candidateTypes], UnionReduction.Subtype)); + } + else { + if (callsType) { + types.push(callsType); + } + if (length(candidateTypes)) { + types.push(...candidateTypes); + } + } + types.push(...inferNamedTypesFromProperties(usage)); return types; } diff --git a/tests/cases/fourslash/codeFixInferFromUsageVariable4.ts b/tests/cases/fourslash/codeFixInferFromUsageVariable4.ts new file mode 100644 index 00000000000..12db84cfef0 --- /dev/null +++ b/tests/cases/fourslash/codeFixInferFromUsageVariable4.ts @@ -0,0 +1,13 @@ +/// + +// @noImplicitAny: false +////[|let foo;|] +//// +////foo?.(); +////foo = () => {} + +verify.codeFix({ + description: "Infer type of 'foo' from usage", + index: 0, + newRangeContent: "let foo: () => void;" +});