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: "" +}] }];`, +});