diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ca6ab49708c75..36dad0b34b05d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14046,7 +14046,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { else if (type !== firstType) { checkFlags |= CheckFlags.HasNonUniformType; } - if (isLiteralType(type) || isPatternLiteralType(type) || type === uniqueLiteralType) { + if (isLiteralType(type) || isPatternLiteralType(type)) { checkFlags |= CheckFlags.HasLiteralType; } if (type.flags & TypeFlags.Never && type !== uniqueLiteralType) { diff --git a/tests/baselines/reference/inferenceAndHKTs.symbols b/tests/baselines/reference/inferenceAndHKTs.symbols new file mode 100644 index 0000000000000..8542a0b36222e --- /dev/null +++ b/tests/baselines/reference/inferenceAndHKTs.symbols @@ -0,0 +1,100 @@ +=== tests/cases/compiler/inferenceAndHKTs.ts === +// Repro from #53970 + +export interface TypeLambda { +>TypeLambda : Symbol(TypeLambda, Decl(inferenceAndHKTs.ts, 0, 0)) + + readonly A: unknown; +>A : Symbol(TypeLambda.A, Decl(inferenceAndHKTs.ts, 2, 29)) +} + +export interface TypeClass { +>TypeClass : Symbol(TypeClass, Decl(inferenceAndHKTs.ts, 4, 1)) +>F : Symbol(F, Decl(inferenceAndHKTs.ts, 6, 27)) +>TypeLambda : Symbol(TypeLambda, Decl(inferenceAndHKTs.ts, 0, 0)) + + readonly _F: F; +>_F : Symbol(TypeClass._F, Decl(inferenceAndHKTs.ts, 6, 50)) +>F : Symbol(F, Decl(inferenceAndHKTs.ts, 6, 27)) +} + +export type Apply = F extends { readonly type: unknown } +>Apply : Symbol(Apply, Decl(inferenceAndHKTs.ts, 8, 1)) +>F : Symbol(F, Decl(inferenceAndHKTs.ts, 10, 18)) +>TypeLambda : Symbol(TypeLambda, Decl(inferenceAndHKTs.ts, 0, 0)) +>A : Symbol(A, Decl(inferenceAndHKTs.ts, 10, 39)) +>F : Symbol(F, Decl(inferenceAndHKTs.ts, 10, 18)) +>type : Symbol(type, Decl(inferenceAndHKTs.ts, 10, 56)) + + ? (F & { readonly A: A })['type'] +>F : Symbol(F, Decl(inferenceAndHKTs.ts, 10, 18)) +>A : Symbol(A, Decl(inferenceAndHKTs.ts, 11, 12)) +>A : Symbol(A, Decl(inferenceAndHKTs.ts, 10, 39)) + + : { readonly F: F, readonly A: A }; +>F : Symbol(F, Decl(inferenceAndHKTs.ts, 12, 7)) +>F : Symbol(F, Decl(inferenceAndHKTs.ts, 10, 18)) +>A : Symbol(A, Decl(inferenceAndHKTs.ts, 12, 22)) +>A : Symbol(A, Decl(inferenceAndHKTs.ts, 10, 39)) + +export interface T { +>T : Symbol(T, Decl(inferenceAndHKTs.ts, 12, 39)) +>A : Symbol(A, Decl(inferenceAndHKTs.ts, 14, 19)) + + value: A; +>value : Symbol(T.value, Decl(inferenceAndHKTs.ts, 14, 23)) +>A : Symbol(A, Decl(inferenceAndHKTs.ts, 14, 19)) +} + +export interface TTypeLambda extends TypeLambda { +>TTypeLambda : Symbol(TTypeLambda, Decl(inferenceAndHKTs.ts, 16, 1)) +>TypeLambda : Symbol(TypeLambda, Decl(inferenceAndHKTs.ts, 0, 0)) + + readonly type: T; +>type : Symbol(TTypeLambda.type, Decl(inferenceAndHKTs.ts, 18, 49)) +>T : Symbol(T, Decl(inferenceAndHKTs.ts, 12, 39)) +} + +export declare const map: (F: TypeClass) => (a: Apply, f: (a: A) => B) => Apply; +>map : Symbol(map, Decl(inferenceAndHKTs.ts, 22, 20)) +>F : Symbol(F, Decl(inferenceAndHKTs.ts, 22, 27), Decl(inferenceAndHKTs.ts, 22, 49)) +>TypeLambda : Symbol(TypeLambda, Decl(inferenceAndHKTs.ts, 0, 0)) +>F : Symbol(F, Decl(inferenceAndHKTs.ts, 22, 27), Decl(inferenceAndHKTs.ts, 22, 49)) +>TypeClass : Symbol(TypeClass, Decl(inferenceAndHKTs.ts, 4, 1)) +>F : Symbol(F, Decl(inferenceAndHKTs.ts, 22, 27), Decl(inferenceAndHKTs.ts, 22, 49)) +>A : Symbol(A, Decl(inferenceAndHKTs.ts, 22, 70)) +>B : Symbol(B, Decl(inferenceAndHKTs.ts, 22, 72)) +>a : Symbol(a, Decl(inferenceAndHKTs.ts, 22, 76)) +>Apply : Symbol(Apply, Decl(inferenceAndHKTs.ts, 8, 1)) +>F : Symbol(F, Decl(inferenceAndHKTs.ts, 22, 27), Decl(inferenceAndHKTs.ts, 22, 49)) +>A : Symbol(A, Decl(inferenceAndHKTs.ts, 22, 70)) +>f : Symbol(f, Decl(inferenceAndHKTs.ts, 22, 91)) +>a : Symbol(a, Decl(inferenceAndHKTs.ts, 22, 96)) +>A : Symbol(A, Decl(inferenceAndHKTs.ts, 22, 70)) +>B : Symbol(B, Decl(inferenceAndHKTs.ts, 22, 72)) +>Apply : Symbol(Apply, Decl(inferenceAndHKTs.ts, 8, 1)) +>F : Symbol(F, Decl(inferenceAndHKTs.ts, 22, 27), Decl(inferenceAndHKTs.ts, 22, 49)) +>B : Symbol(B, Decl(inferenceAndHKTs.ts, 22, 72)) + +declare const typeClass: TypeClass; +>typeClass : Symbol(typeClass, Decl(inferenceAndHKTs.ts, 24, 13)) +>TypeClass : Symbol(TypeClass, Decl(inferenceAndHKTs.ts, 4, 1)) +>TTypeLambda : Symbol(TTypeLambda, Decl(inferenceAndHKTs.ts, 16, 1)) + +declare const a: T; +>a : Symbol(a, Decl(inferenceAndHKTs.ts, 26, 13)) +>T : Symbol(T, Decl(inferenceAndHKTs.ts, 12, 39)) + +const x1 = map(typeClass); +>x1 : Symbol(x1, Decl(inferenceAndHKTs.ts, 28, 5)) +>map : Symbol(map, Decl(inferenceAndHKTs.ts, 22, 20)) +>typeClass : Symbol(typeClass, Decl(inferenceAndHKTs.ts, 24, 13)) + +const x2 = map(typeClass)(a, (_) => _); // T +>x2 : Symbol(x2, Decl(inferenceAndHKTs.ts, 29, 5)) +>map : Symbol(map, Decl(inferenceAndHKTs.ts, 22, 20)) +>typeClass : Symbol(typeClass, Decl(inferenceAndHKTs.ts, 24, 13)) +>a : Symbol(a, Decl(inferenceAndHKTs.ts, 26, 13)) +>_ : Symbol(_, Decl(inferenceAndHKTs.ts, 29, 30)) +>_ : Symbol(_, Decl(inferenceAndHKTs.ts, 29, 30)) + diff --git a/tests/baselines/reference/inferenceAndHKTs.types b/tests/baselines/reference/inferenceAndHKTs.types new file mode 100644 index 0000000000000..51fc87bf76b8d --- /dev/null +++ b/tests/baselines/reference/inferenceAndHKTs.types @@ -0,0 +1,64 @@ +=== tests/cases/compiler/inferenceAndHKTs.ts === +// Repro from #53970 + +export interface TypeLambda { + readonly A: unknown; +>A : unknown +} + +export interface TypeClass { + readonly _F: F; +>_F : F +} + +export type Apply = F extends { readonly type: unknown } +>Apply : Apply +>type : unknown + + ? (F & { readonly A: A })['type'] +>A : A + + : { readonly F: F, readonly A: A }; +>F : F +>A : A + +export interface T { + value: A; +>value : A +} + +export interface TTypeLambda extends TypeLambda { + readonly type: T; +>type : T +} + +export declare const map: (F: TypeClass) => (a: Apply, f: (a: A) => B) => Apply; +>map : (F: TypeClass) => (a: Apply, f: (a: A) => B) => Apply +>F : TypeClass +>a : Apply +>f : (a: A) => B +>a : A + +declare const typeClass: TypeClass; +>typeClass : TypeClass + +declare const a: T; +>a : T + +const x1 = map(typeClass); +>x1 : (a: T, f: (a: A) => B) => T +>map(typeClass) : (a: T, f: (a: A) => B) => T +>map : (F: TypeClass) => (a: Apply, f: (a: A) => B) => Apply +>typeClass : TypeClass + +const x2 = map(typeClass)(a, (_) => _); // T +>x2 : T +>map(typeClass)(a, (_) => _) : T +>map(typeClass) : (a: T, f: (a: A) => B) => T +>map : (F: TypeClass) => (a: Apply, f: (a: A) => B) => Apply +>typeClass : TypeClass +>a : T +>(_) => _ : (_: number) => number +>_ : number +>_ : number + diff --git a/tests/cases/compiler/inferenceAndHKTs.ts b/tests/cases/compiler/inferenceAndHKTs.ts new file mode 100644 index 0000000000000..00887c7fa9157 --- /dev/null +++ b/tests/cases/compiler/inferenceAndHKTs.ts @@ -0,0 +1,33 @@ +// @strict: true +// @noEmit: true + +// Repro from #53970 + +export interface TypeLambda { + readonly A: unknown; +} + +export interface TypeClass { + readonly _F: F; +} + +export type Apply = F extends { readonly type: unknown } + ? (F & { readonly A: A })['type'] + : { readonly F: F, readonly A: A }; + +export interface T { + value: A; +} + +export interface TTypeLambda extends TypeLambda { + readonly type: T; +} + +export declare const map: (F: TypeClass) => (a: Apply, f: (a: A) => B) => Apply; + +declare const typeClass: TypeClass; + +declare const a: T; + +const x1 = map(typeClass); +const x2 = map(typeClass)(a, (_) => _); // T