diff --git a/src/services/codefixes/inferFromUsage.ts b/src/services/codefixes/inferFromUsage.ts
index 5718f592cb82a..3726517cc60b4 100644
--- a/src/services/codefixes/inferFromUsage.ts
+++ b/src/services/codefixes/inferFromUsage.ts
@@ -610,7 +610,7 @@ namespace ts.codefix {
switch (node.parent.kind) {
case SyntaxKind.ExpressionStatement:
- addCandidateType(usage, checker.getVoidType());
+ inferTypeFromExpressionStatement(node, usage);
break;
case SyntaxKind.PostfixUnaryExpression:
usage.isNumber = true;
@@ -668,6 +668,10 @@ namespace ts.codefix {
}
}
+ function inferTypeFromExpressionStatement(node: Expression, usage: Usage): void {
+ addCandidateType(usage, isCallExpression(node) ? checker.getVoidType() : checker.getAnyType());
+ }
+
function inferTypeFromPrefixUnaryExpression(node: PrefixUnaryExpression, usage: Usage): void {
switch (node.operator) {
case SyntaxKind.PlusPlusToken:
@@ -967,10 +971,7 @@ namespace ts.codefix {
if (usage.numberIndex) {
types.push(checker.createArrayType(combineFromUsage(usage.numberIndex)));
}
- if (usage.properties && usage.properties.size
- || usage.calls && usage.calls.length
- || usage.constructs && usage.constructs.length
- || usage.stringIndex) {
+ if (usage.properties?.size || usage.calls?.length || usage.constructs?.length || usage.stringIndex) {
types.push(inferStructuralType(usage));
}
diff --git a/src/services/textChanges.ts b/src/services/textChanges.ts
index 07a75d884d9a2..c23281e0ff9a7 100644
--- a/src/services/textChanges.ts
+++ b/src/services/textChanges.ts
@@ -406,7 +406,7 @@ namespace ts.textChanges {
}
}
else {
- endNode = node.kind !== SyntaxKind.VariableDeclaration && node.questionToken ? node.questionToken : node.name;
+ endNode = (node.kind === SyntaxKind.VariableDeclaration ? node.exclamationToken : node.questionToken) ?? node.name;
}
this.insertNodeAt(sourceFile, endNode.end, type, { prefix: ": " });
diff --git a/tests/cases/fourslash/codeFixInferFromUsageParameterLiteral.ts b/tests/cases/fourslash/codeFixInferFromUsageParameterLiteral.ts
new file mode 100644
index 0000000000000..1661063598299
--- /dev/null
+++ b/tests/cases/fourslash/codeFixInferFromUsageParameterLiteral.ts
@@ -0,0 +1,10 @@
+///
+
+// @noImplicitAny: true
+//// function foo([|text |]) {
+//// text.length;
+//// text.indexOf("z");
+//// text.charAt(0);
+//// }
+
+verify.rangeAfterCodeFix("text: string", /*includeWhiteSpace*/ undefined, /*errorCode*/ undefined, /*index*/0);
diff --git a/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts b/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts
index 44d2e2d7b1c25..41112b2409eff 100644
--- a/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts
+++ b/tests/cases/fourslash/codeFixInferFromUsagePropertyAccess.ts
@@ -12,4 +12,4 @@
//// return x.y.z
////}
-verify.rangeAfterCodeFix("a: { b: { c: void; }; }, m: { n: () => number; }, x: { y: { z: number[]; }; }", /*includeWhiteSpace*/ undefined, /*errorCode*/ undefined, /*index*/0);
+verify.rangeAfterCodeFix("a: { b: { c: any; }; }, m: { n: () => number; }, x: { y: { z: number[]; }; }", /*includeWhiteSpace*/ undefined, /*errorCode*/ undefined, /*index*/0);
diff --git a/tests/cases/fourslash/codeFixInferFromUsagePropertyAccessJS.ts b/tests/cases/fourslash/codeFixInferFromUsagePropertyAccessJS.ts
index 357b1a991ba83..ed9d4b33b377c 100644
--- a/tests/cases/fourslash/codeFixInferFromUsagePropertyAccessJS.ts
+++ b/tests/cases/fourslash/codeFixInferFromUsagePropertyAccessJS.ts
@@ -21,7 +21,7 @@ verify.codeFix({
index: 0,
newFileContent:
`/**
- * @param {{ b: { c: void; }; }} a
+ * @param {{ b: { c: any; }; }} a
* @param {{ n: () => number; }} m
* @param {{ y: { z: number[]; }; }} x
*/
diff --git a/tests/cases/fourslash/codeFixInferFromUsageVariableLiteral.ts b/tests/cases/fourslash/codeFixInferFromUsageVariableLiteral.ts
new file mode 100644
index 0000000000000..2641b00963601
--- /dev/null
+++ b/tests/cases/fourslash/codeFixInferFromUsageVariableLiteral.ts
@@ -0,0 +1,9 @@
+///
+
+// @noImplicitAny: true
+//// let [|text! |];
+//// text.length;
+//// text.indexOf("z");
+//// text.charAt(0);
+
+verify.rangeAfterCodeFix("text!: string", /*includeWhiteSpace*/ undefined, /*errorCode*/ undefined, /*index*/0);