From 9ad4be713179403583ab8c9d17ddbb6c4aa15544 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Tue, 4 Mar 2025 22:52:00 +0100 Subject: [PATCH] Properly discriminate by pattern literal types in `isTypeInvalidDueToUnionDiscriminant` --- src/compiler/checker.ts | 2 +- .../completionsDiscriminatedUnion2.ts | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/completionsDiscriminatedUnion2.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index caab75c99fa8a..4583dca0806ee 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14453,7 +14453,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { const nameType = property.name && (isJsxNamespacedName(property.name) ? getStringLiteralType(getTextOfJsxAttributeName(property.name)) : getLiteralTypeFromPropertyName(property.name)); const name = nameType && isTypeUsableAsPropertyName(nameType) ? getPropertyNameFromType(nameType) : undefined; const expected = name === undefined ? undefined : getTypeOfPropertyOfType(contextualType, name); - return !!expected && isLiteralType(expected) && !isTypeAssignableTo(getTypeOfNode(property), expected); + return !!expected && (isLiteralType(expected) || isPatternLiteralType(expected)) && !isTypeAssignableTo(getTypeOfNode(property), expected); }); } diff --git a/tests/cases/fourslash/completionsDiscriminatedUnion2.ts b/tests/cases/fourslash/completionsDiscriminatedUnion2.ts new file mode 100644 index 0000000000000..2167b8a706499 --- /dev/null +++ b/tests/cases/fourslash/completionsDiscriminatedUnion2.ts @@ -0,0 +1,19 @@ +/// + +// @strict: true + +//// type A = { +//// id: `A:${string}`; +//// a: number; +//// }; +//// +//// type B = { +//// id: `B:${string}`; +//// b: number; +//// }; +//// +//// function foo(item: T): void {} +//// +//// foo({ id: "B:", /**/ }); + +verify.completions({ marker: "", exact: ["b"] });