diff --git a/src/services/codefixes/inferFromUsage.ts b/src/services/codefixes/inferFromUsage.ts index 046eb915c1ef6..b952cc5a98db2 100644 --- a/src/services/codefixes/inferFromUsage.ts +++ b/src/services/codefixes/inferFromUsage.ts @@ -521,7 +521,7 @@ namespace ts.codefix { if (!usageContext.properties) { usageContext.properties = createUnderscoreEscapedMap(); } - const propertyUsageContext = {}; + const propertyUsageContext = usageContext.properties.get(name) || { }; inferTypeFromContext(parent, checker, propertyUsageContext); usageContext.properties.set(name, propertyUsageContext); } @@ -575,7 +575,7 @@ namespace ts.codefix { if (usageContext.properties) { usageContext.properties.forEach((context, name) => { const symbol = checker.createSymbol(SymbolFlags.Property, name); - symbol.type = getTypeFromUsageContext(context, checker); + symbol.type = getTypeFromUsageContext(context, checker) || checker.getAnyType(); members.set(name, symbol); }); } @@ -636,7 +636,7 @@ namespace ts.codefix { symbol.type = checker.getWidenedType(checker.getBaseTypeOfLiteralType(callContext.argumentTypes[i])); parameters.push(symbol); } - const returnType = getTypeFromUsageContext(callContext.returnType, checker); + const returnType = getTypeFromUsageContext(callContext.returnType, checker) || checker.getVoidType(); return checker.createSignature(/*declaration*/ undefined, /*typeParameters*/ undefined, /*thisParameter*/ undefined, parameters, returnType, /*typePredicate*/ undefined, callContext.argumentTypes.length, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false); } diff --git a/tests/cases/fourslash/codeFixInferFromUsageCall.ts b/tests/cases/fourslash/codeFixInferFromUsageCall.ts new file mode 100644 index 0000000000000..e74b6faf7d3f9 --- /dev/null +++ b/tests/cases/fourslash/codeFixInferFromUsageCall.ts @@ -0,0 +1,8 @@ +/// + +// @noImplicitAny: true +////function wat([|b |]) { +//// b(); +////} + +verify.rangeAfterCodeFix("b: () => void"); \ No newline at end of file diff --git a/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts b/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts new file mode 100644 index 0000000000000..c8b85ee11e88d --- /dev/null +++ b/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts @@ -0,0 +1,15 @@ +/// + +// @noImplicitAny: true +////function foo([|a, m, x |]) { +//// a.b.c; +//// +//// var numeric = 0; +//// numeric = m.n(); +//// +//// x.y.z +//// x.y.z.push(0); +//// return x.y.z +////} + +verify.rangeAfterCodeFix("a: { b: { c: any; }; }, m: { n: () => number; }, x: { y: { z: number[]; }; }", /*includeWhiteSpace*/ undefined, /*errorCode*/ undefined, /*index*/0); \ No newline at end of file