diff --git a/src/services/codefixes/fixAddMissingMember.ts b/src/services/codefixes/fixAddMissingMember.ts
index f448482e4ed9a..c57d2a37fd355 100644
--- a/src/services/codefixes/fixAddMissingMember.ts
+++ b/src/services/codefixes/fixAddMissingMember.ts
@@ -315,13 +315,13 @@ function getInfo(sourceFile: SourceFile, tokenPos: number, errorCode: number, ch
const param = signature.parameters[argIndex].valueDeclaration;
if (!(param && isParameter(param) && isIdentifier(param.name))) return undefined;
- const properties = arrayFrom(checker.getUnmatchedProperties(checker.getTypeAtLocation(parent), checker.getParameterType(signature, argIndex), /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ false));
+ const properties = arrayFrom(checker.getUnmatchedProperties(checker.getTypeAtLocation(parent), checker.getParameterType(signature, argIndex).getNonNullableType(), /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ false));
if (!length(properties)) return undefined;
return { kind: InfoKind.ObjectLiteral, token: param.name, identifier: param.name.text, properties, parentDeclaration: parent };
}
if (token.kind === SyntaxKind.OpenBraceToken && isObjectLiteralExpression(parent)) {
- const targetType = checker.getContextualType(parent) || checker.getTypeAtLocation(parent);
+ const targetType = (checker.getContextualType(parent) || checker.getTypeAtLocation(parent))?.getNonNullableType();
const properties = arrayFrom(checker.getUnmatchedProperties(checker.getTypeAtLocation(parent), targetType, /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ false));
if (!length(properties)) return undefined;
@@ -334,7 +334,7 @@ function getInfo(sourceFile: SourceFile, tokenPos: number, errorCode: number, ch
if (!isMemberName(token)) return undefined;
if (isIdentifier(token) && hasInitializer(parent) && parent.initializer && isObjectLiteralExpression(parent.initializer)) {
- const targetType = checker.getContextualType(token) || checker.getTypeAtLocation(token);
+ const targetType = (checker.getContextualType(token) || checker.getTypeAtLocation(token))?.getNonNullableType();
const properties = arrayFrom(checker.getUnmatchedProperties(checker.getTypeAtLocation(parent.initializer), targetType, /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ false));
if (!length(properties)) return undefined;
diff --git a/tests/cases/fourslash/codeFixAddMissingProperties30.ts b/tests/cases/fourslash/codeFixAddMissingProperties30.ts
index 3475c38db7642..720038818209b 100644
--- a/tests/cases/fourslash/codeFixAddMissingProperties30.ts
+++ b/tests/cases/fourslash/codeFixAddMissingProperties30.ts
@@ -9,7 +9,6 @@
////}
////[|f([{}])|]
-debugger;
verify.codeFix({
index: 0,
description: ts.Diagnostics.Add_missing_properties.message,
diff --git a/tests/cases/fourslash/codeFixAddMissingProperties31.ts b/tests/cases/fourslash/codeFixAddMissingProperties31.ts
index c05e87d68d468..efc15962fb828 100644
--- a/tests/cases/fourslash/codeFixAddMissingProperties31.ts
+++ b/tests/cases/fourslash/codeFixAddMissingProperties31.ts
@@ -9,7 +9,6 @@
////}
////[|const b: B[] = [{c: [{}]}]|]
-debugger;
verify.codeFix({
index: 0,
description: ts.Diagnostics.Add_missing_properties.message,
diff --git a/tests/cases/fourslash/codeFixAddMissingProperties45.ts b/tests/cases/fourslash/codeFixAddMissingProperties45.ts
new file mode 100644
index 0000000000000..4a2f30f73ad36
--- /dev/null
+++ b/tests/cases/fourslash/codeFixAddMissingProperties45.ts
@@ -0,0 +1,15 @@
+///
+
+// @strict: true
+
+//// type U = { u?: { v: string } };
+//// const u: U = { [|u: {}|] };
+
+verify.codeFix({
+ index: 0,
+ description: ts.Diagnostics.Add_missing_properties.message,
+ newRangeContent:
+`u: {
+ v: ""
+}`,
+});
diff --git a/tests/cases/fourslash/codeFixAddMissingProperties46.ts b/tests/cases/fourslash/codeFixAddMissingProperties46.ts
new file mode 100644
index 0000000000000..3d0e64257fe1f
--- /dev/null
+++ b/tests/cases/fourslash/codeFixAddMissingProperties46.ts
@@ -0,0 +1,16 @@
+///
+
+// @strict: true
+
+//// type T = { t: string };
+//// declare function f(arg?: T): void;
+//// f([|{}|]);
+
+verify.codeFix({
+ index: 0,
+ description: ts.Diagnostics.Add_missing_properties.message,
+ newRangeContent:
+`{
+ t: ""
+}`,
+});
diff --git a/tests/cases/fourslash/codeFixAddMissingProperties47.ts b/tests/cases/fourslash/codeFixAddMissingProperties47.ts
new file mode 100644
index 0000000000000..8d26466aaf671
--- /dev/null
+++ b/tests/cases/fourslash/codeFixAddMissingProperties47.ts
@@ -0,0 +1,22 @@
+///
+
+// @strict: true
+
+//// interface A {
+//// a: number;
+//// b: string;
+//// }
+//// function f(_obj: (A | undefined)[]): string {
+//// return "";
+//// }
+//// [|f([{}]);|]
+
+verify.codeFix({
+ index: 0,
+ description: ts.Diagnostics.Add_missing_properties.message,
+ newRangeContent:
+`f([{
+ a: 0,
+ b: ""
+}]);`,
+});
diff --git a/tests/cases/fourslash/codeFixAddMissingProperties48.ts b/tests/cases/fourslash/codeFixAddMissingProperties48.ts
new file mode 100644
index 0000000000000..69993cd821b0a
--- /dev/null
+++ b/tests/cases/fourslash/codeFixAddMissingProperties48.ts
@@ -0,0 +1,22 @@
+///
+
+// @strict: true
+
+//// interface A {
+//// a: number;
+//// b: string;
+//// }
+//// interface B {
+//// c: (A | undefined)[];
+//// }
+//// [|const b: B[] = [{ c: [{}] }];|]
+
+verify.codeFix({
+ index: 0,
+ description: ts.Diagnostics.Add_missing_properties.message,
+ newRangeContent:
+`const b: B[] = [{ c: [{
+ a: 0,
+ b: ""
+}] }];`,
+});