diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 40d4f07ffd325..d3bb73aa7189c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -17908,7 +17908,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { function isPatternLiteralPlaceholderType(type: Type): boolean { if (type.flags & TypeFlags.Intersection) { - return some((type as IntersectionType).types, t => !!(t.flags & (TypeFlags.Literal | TypeFlags.Null | TypeFlags.Undefined)) || isPatternLiteralPlaceholderType(t)); + return !isGenericType(type) && some((type as IntersectionType).types, t => !!(t.flags & (TypeFlags.Literal | TypeFlags.Nullable)) || isPatternLiteralPlaceholderType(t)); } return !!(type.flags & (TypeFlags.Any | TypeFlags.String | TypeFlags.Number | TypeFlags.BigInt)) || isPatternLiteralType(type); } diff --git a/tests/baselines/reference/stringMappingDeferralInConditionalTypes.symbols b/tests/baselines/reference/stringMappingDeferralInConditionalTypes.symbols new file mode 100644 index 0000000000000..dc7a1a0bae710 --- /dev/null +++ b/tests/baselines/reference/stringMappingDeferralInConditionalTypes.symbols @@ -0,0 +1,68 @@ +//// [tests/cases/conformance/types/literal/stringMappingDeferralInConditionalTypes.ts] //// + +=== stringMappingDeferralInConditionalTypes.ts === +// https://github.com/microsoft/TypeScript/issues/55847 + +type A = Lowercase extends "foo" ? 1 : 0; +>A : Symbol(A, Decl(stringMappingDeferralInConditionalTypes.ts, 0, 0)) +>S : Symbol(S, Decl(stringMappingDeferralInConditionalTypes.ts, 2, 7)) +>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --)) +>S : Symbol(S, Decl(stringMappingDeferralInConditionalTypes.ts, 2, 7)) + +let x1: A<"foo"> = 1; // ok +>x1 : Symbol(x1, Decl(stringMappingDeferralInConditionalTypes.ts, 3, 3)) +>A : Symbol(A, Decl(stringMappingDeferralInConditionalTypes.ts, 0, 0)) + +type B = Lowercase extends `f${string}` ? 1 : 0; +>B : Symbol(B, Decl(stringMappingDeferralInConditionalTypes.ts, 3, 21)) +>S : Symbol(S, Decl(stringMappingDeferralInConditionalTypes.ts, 5, 7)) +>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --)) +>S : Symbol(S, Decl(stringMappingDeferralInConditionalTypes.ts, 5, 7)) + +let x2: B<"foo"> = 1; // ok +>x2 : Symbol(x2, Decl(stringMappingDeferralInConditionalTypes.ts, 6, 3)) +>B : Symbol(B, Decl(stringMappingDeferralInConditionalTypes.ts, 3, 21)) + +type C = Capitalize> extends "Foo" ? 1 : 0; +>C : Symbol(C, Decl(stringMappingDeferralInConditionalTypes.ts, 6, 21)) +>S : Symbol(S, Decl(stringMappingDeferralInConditionalTypes.ts, 8, 7)) +>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --)) +>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --)) +>S : Symbol(S, Decl(stringMappingDeferralInConditionalTypes.ts, 8, 7)) + +let x3: C<"foo"> = 1; // ok +>x3 : Symbol(x3, Decl(stringMappingDeferralInConditionalTypes.ts, 9, 3)) +>C : Symbol(C, Decl(stringMappingDeferralInConditionalTypes.ts, 6, 21)) + +type D = Capitalize> extends "Foo" ? 1 : 0; +>D : Symbol(D, Decl(stringMappingDeferralInConditionalTypes.ts, 9, 21)) +>S : Symbol(S, Decl(stringMappingDeferralInConditionalTypes.ts, 11, 7)) +>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --)) +>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --)) +>S : Symbol(S, Decl(stringMappingDeferralInConditionalTypes.ts, 11, 7)) + +let x4: D<"foo"> = 1; // ok +>x4 : Symbol(x4, Decl(stringMappingDeferralInConditionalTypes.ts, 12, 3)) +>D : Symbol(D, Decl(stringMappingDeferralInConditionalTypes.ts, 9, 21)) + +type E = Lowercase<`f${S & string}` & `${S & string}f`>; +>E : Symbol(E, Decl(stringMappingDeferralInConditionalTypes.ts, 12, 21)) +>S : Symbol(S, Decl(stringMappingDeferralInConditionalTypes.ts, 14, 7)) +>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --)) +>S : Symbol(S, Decl(stringMappingDeferralInConditionalTypes.ts, 14, 7)) +>S : Symbol(S, Decl(stringMappingDeferralInConditionalTypes.ts, 14, 7)) + +type F = E<""> extends "f" ? 1 : 0; // 1 +>F : Symbol(F, Decl(stringMappingDeferralInConditionalTypes.ts, 14, 59)) +>E : Symbol(E, Decl(stringMappingDeferralInConditionalTypes.ts, 12, 21)) + +type G = E extends "f" ? 1 : 0; +>G : Symbol(G, Decl(stringMappingDeferralInConditionalTypes.ts, 15, 35)) +>S : Symbol(S, Decl(stringMappingDeferralInConditionalTypes.ts, 16, 7)) +>E : Symbol(E, Decl(stringMappingDeferralInConditionalTypes.ts, 12, 21)) +>S : Symbol(S, Decl(stringMappingDeferralInConditionalTypes.ts, 16, 7)) + +let x5: G<""> = 1; // ok +>x5 : Symbol(x5, Decl(stringMappingDeferralInConditionalTypes.ts, 17, 3)) +>G : Symbol(G, Decl(stringMappingDeferralInConditionalTypes.ts, 15, 35)) + diff --git a/tests/baselines/reference/stringMappingDeferralInConditionalTypes.types b/tests/baselines/reference/stringMappingDeferralInConditionalTypes.types new file mode 100644 index 0000000000000..2fe4b9b941521 --- /dev/null +++ b/tests/baselines/reference/stringMappingDeferralInConditionalTypes.types @@ -0,0 +1,46 @@ +//// [tests/cases/conformance/types/literal/stringMappingDeferralInConditionalTypes.ts] //// + +=== stringMappingDeferralInConditionalTypes.ts === +// https://github.com/microsoft/TypeScript/issues/55847 + +type A = Lowercase extends "foo" ? 1 : 0; +>A : A + +let x1: A<"foo"> = 1; // ok +>x1 : 1 +>1 : 1 + +type B = Lowercase extends `f${string}` ? 1 : 0; +>B : B + +let x2: B<"foo"> = 1; // ok +>x2 : 1 +>1 : 1 + +type C = Capitalize> extends "Foo" ? 1 : 0; +>C : C + +let x3: C<"foo"> = 1; // ok +>x3 : 1 +>1 : 1 + +type D = Capitalize> extends "Foo" ? 1 : 0; +>D : D + +let x4: D<"foo"> = 1; // ok +>x4 : 1 +>1 : 1 + +type E = Lowercase<`f${S & string}` & `${S & string}f`>; +>E : Lowercase<`f${S & string}` & `${S & string}f`> + +type F = E<""> extends "f" ? 1 : 0; // 1 +>F : 1 + +type G = E extends "f" ? 1 : 0; +>G : G + +let x5: G<""> = 1; // ok +>x5 : 1 +>1 : 1 + diff --git a/tests/cases/conformance/types/literal/stringMappingDeferralInConditionalTypes.ts b/tests/cases/conformance/types/literal/stringMappingDeferralInConditionalTypes.ts new file mode 100644 index 0000000000000..d003accdb9140 --- /dev/null +++ b/tests/cases/conformance/types/literal/stringMappingDeferralInConditionalTypes.ts @@ -0,0 +1,21 @@ +// @strict: true +// @noEmit: true + +// https://github.com/microsoft/TypeScript/issues/55847 + +type A = Lowercase extends "foo" ? 1 : 0; +let x1: A<"foo"> = 1; // ok + +type B = Lowercase extends `f${string}` ? 1 : 0; +let x2: B<"foo"> = 1; // ok + +type C = Capitalize> extends "Foo" ? 1 : 0; +let x3: C<"foo"> = 1; // ok + +type D = Capitalize> extends "Foo" ? 1 : 0; +let x4: D<"foo"> = 1; // ok + +type E = Lowercase<`f${S & string}` & `${S & string}f`>; +type F = E<""> extends "f" ? 1 : 0; // 1 +type G = E extends "f" ? 1 : 0; +let x5: G<""> = 1; // ok