mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-17 21:06:50 -05:00
Merge pull request #10403 from Microsoft/completionsForNullableObjects
Fix completions for nullable objects
This commit is contained in:
@@ -3789,7 +3789,11 @@ namespace ts {
|
||||
// other than those within the declared type.
|
||||
isNewIdentifierLocation = true;
|
||||
|
||||
// If the object literal is being assigned to something of type 'null | { hello: string }',
|
||||
// it clearly isn't trying to satisfy the 'null' type. So we grab the non-nullable type if possible.
|
||||
typeForObject = typeChecker.getContextualType(<ObjectLiteralExpression>objectLikeContainer);
|
||||
typeForObject = typeForObject && typeForObject.getNonNullableType();
|
||||
|
||||
existingMembers = (<ObjectLiteralExpression>objectLikeContainer).properties;
|
||||
}
|
||||
else if (objectLikeContainer.kind === SyntaxKind.ObjectBindingPattern) {
|
||||
@@ -3801,7 +3805,7 @@ namespace ts {
|
||||
// We don't want to complete using the type acquired by the shape
|
||||
// of the binding pattern; we are only interested in types acquired
|
||||
// through type declaration or inference.
|
||||
// Also proceed if rootDeclaration is parameter and if its containing function expression\arrow function is contextually typed -
|
||||
// Also proceed if rootDeclaration is a parameter and if its containing function expression/arrow function is contextually typed -
|
||||
// type of parameter will flow in from the contextual type of the function
|
||||
let canGetType = !!(rootDeclaration.initializer || rootDeclaration.type);
|
||||
if (!canGetType && rootDeclaration.kind === SyntaxKind.Parameter) {
|
||||
|
||||
28
tests/cases/fourslash/completionListInObjectLiteral4.ts
Normal file
28
tests/cases/fourslash/completionListInObjectLiteral4.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
/// <reference path='fourslash.ts'/>
|
||||
|
||||
// @strictNullChecks: true
|
||||
////interface Thing {
|
||||
//// hello: number;
|
||||
//// world: string;
|
||||
////}
|
||||
////
|
||||
////declare function funcA(x : Thing): void;
|
||||
////declare function funcB(x?: Thing): void;
|
||||
////declare function funcC(x : Thing | null): void;
|
||||
////declare function funcD(x : Thing | undefined): void;
|
||||
////declare function funcE(x : Thing | null | undefined): void;
|
||||
////declare function funcF(x?: Thing | null | undefined): void;
|
||||
////
|
||||
////funcA({ /*A*/ });
|
||||
////funcB({ /*B*/ });
|
||||
////funcC({ /*C*/ });
|
||||
////funcD({ /*D*/ });
|
||||
////funcE({ /*E*/ });
|
||||
////funcF({ /*F*/ });
|
||||
|
||||
|
||||
for (const marker of test.markers()) {
|
||||
goTo.position(marker.position);
|
||||
verify.completionListContains("hello");
|
||||
verify.completionListContains("world");
|
||||
}
|
||||
Reference in New Issue
Block a user