diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5dde5dd904b5c..9e1d960030920 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10163,7 +10163,7 @@ namespace ts { function getConditionalTypeWorker(root: ConditionalRoot, mapper: TypeMapper | undefined, checkType: Type, extendsType: Type, trueType: Type, falseType: Type) { // Simplifications for types of the form `T extends U ? T : never` and `T extends U ? never : T`. - if (falseType.flags & TypeFlags.Never && isTypeIdenticalTo(getActualTypeVariable(trueType), getActualTypeVariable(checkType))) { + if (falseType.flags & TypeFlags.Never && getActualTypeVariable(trueType) === getActualTypeVariable(checkType)) { if (checkType.flags & TypeFlags.Any || isTypeAssignableTo(getRestrictiveInstantiation(checkType), getRestrictiveInstantiation(extendsType))) { // Always true return trueType; } @@ -10171,7 +10171,7 @@ namespace ts { return neverType; } } - else if (trueType.flags & TypeFlags.Never && isTypeIdenticalTo(getActualTypeVariable(falseType), getActualTypeVariable(checkType))) { + else if (trueType.flags & TypeFlags.Never && getActualTypeVariable(falseType) === getActualTypeVariable(checkType)) { if (!(checkType.flags & TypeFlags.Any) && isTypeAssignableTo(getRestrictiveInstantiation(checkType), getRestrictiveInstantiation(extendsType))) { // Always true return neverType; } diff --git a/tests/baselines/reference/conditionalTypeSimplification.js b/tests/baselines/reference/conditionalTypeSimplification.js new file mode 100644 index 0000000000000..ad691981658ce --- /dev/null +++ b/tests/baselines/reference/conditionalTypeSimplification.js @@ -0,0 +1,15 @@ +//// [conditionalTypeSimplification.ts] +// Repro from #30794 + +interface AbstractSchema { + m1 (v: T): SchemaType>; + m2 (v: T): SchemaType; +} + +type SchemaType = S extends object ? AnySchema : never; +interface AnySchema extends AnySchemaType, V> { } +interface AnySchemaType, V> extends AbstractSchema { } + + +//// [conditionalTypeSimplification.js] +// Repro from #30794 diff --git a/tests/baselines/reference/conditionalTypeSimplification.symbols b/tests/baselines/reference/conditionalTypeSimplification.symbols new file mode 100644 index 0000000000000..06c00dc28277b --- /dev/null +++ b/tests/baselines/reference/conditionalTypeSimplification.symbols @@ -0,0 +1,53 @@ +=== tests/cases/compiler/conditionalTypeSimplification.ts === +// Repro from #30794 + +interface AbstractSchema { +>AbstractSchema : Symbol(AbstractSchema, Decl(conditionalTypeSimplification.ts, 0, 0)) +>S : Symbol(S, Decl(conditionalTypeSimplification.ts, 2, 25)) +>V : Symbol(V, Decl(conditionalTypeSimplification.ts, 2, 27)) + + m1 (v: T): SchemaType>; +>m1 : Symbol(AbstractSchema.m1, Decl(conditionalTypeSimplification.ts, 2, 32)) +>T : Symbol(T, Decl(conditionalTypeSimplification.ts, 3, 5)) +>v : Symbol(v, Decl(conditionalTypeSimplification.ts, 3, 9)) +>T : Symbol(T, Decl(conditionalTypeSimplification.ts, 3, 5)) +>SchemaType : Symbol(SchemaType, Decl(conditionalTypeSimplification.ts, 5, 1)) +>S : Symbol(S, Decl(conditionalTypeSimplification.ts, 2, 25)) +>Exclude : Symbol(Exclude, Decl(lib.es5.d.ts, --, --)) +>V : Symbol(V, Decl(conditionalTypeSimplification.ts, 2, 27)) +>T : Symbol(T, Decl(conditionalTypeSimplification.ts, 3, 5)) + + m2 (v: T): SchemaType; +>m2 : Symbol(AbstractSchema.m2, Decl(conditionalTypeSimplification.ts, 3, 45)) +>T : Symbol(T, Decl(conditionalTypeSimplification.ts, 4, 5)) +>v : Symbol(v, Decl(conditionalTypeSimplification.ts, 4, 9)) +>T : Symbol(T, Decl(conditionalTypeSimplification.ts, 4, 5)) +>SchemaType : Symbol(SchemaType, Decl(conditionalTypeSimplification.ts, 5, 1)) +>S : Symbol(S, Decl(conditionalTypeSimplification.ts, 2, 25)) +>T : Symbol(T, Decl(conditionalTypeSimplification.ts, 4, 5)) +} + +type SchemaType = S extends object ? AnySchema : never; +>SchemaType : Symbol(SchemaType, Decl(conditionalTypeSimplification.ts, 5, 1)) +>S : Symbol(S, Decl(conditionalTypeSimplification.ts, 7, 16)) +>V : Symbol(V, Decl(conditionalTypeSimplification.ts, 7, 18)) +>S : Symbol(S, Decl(conditionalTypeSimplification.ts, 7, 16)) +>AnySchema : Symbol(AnySchema, Decl(conditionalTypeSimplification.ts, 7, 64)) +>V : Symbol(V, Decl(conditionalTypeSimplification.ts, 7, 18)) + +interface AnySchema extends AnySchemaType, V> { } +>AnySchema : Symbol(AnySchema, Decl(conditionalTypeSimplification.ts, 7, 64)) +>V : Symbol(V, Decl(conditionalTypeSimplification.ts, 8, 20)) +>AnySchemaType : Symbol(AnySchemaType, Decl(conditionalTypeSimplification.ts, 8, 73)) +>AnySchema : Symbol(AnySchema, Decl(conditionalTypeSimplification.ts, 7, 64)) +>V : Symbol(V, Decl(conditionalTypeSimplification.ts, 8, 20)) + +interface AnySchemaType, V> extends AbstractSchema { } +>AnySchemaType : Symbol(AnySchemaType, Decl(conditionalTypeSimplification.ts, 8, 73)) +>S : Symbol(S, Decl(conditionalTypeSimplification.ts, 9, 24)) +>AbstractSchema : Symbol(AbstractSchema, Decl(conditionalTypeSimplification.ts, 0, 0)) +>V : Symbol(V, Decl(conditionalTypeSimplification.ts, 9, 59)) +>AbstractSchema : Symbol(AbstractSchema, Decl(conditionalTypeSimplification.ts, 0, 0)) +>S : Symbol(S, Decl(conditionalTypeSimplification.ts, 9, 24)) +>V : Symbol(V, Decl(conditionalTypeSimplification.ts, 9, 59)) + diff --git a/tests/baselines/reference/conditionalTypeSimplification.types b/tests/baselines/reference/conditionalTypeSimplification.types new file mode 100644 index 0000000000000..d81e593a9cfbe --- /dev/null +++ b/tests/baselines/reference/conditionalTypeSimplification.types @@ -0,0 +1,19 @@ +=== tests/cases/compiler/conditionalTypeSimplification.ts === +// Repro from #30794 + +interface AbstractSchema { + m1 (v: T): SchemaType>; +>m1 : (v: T) => SchemaType> +>v : T + + m2 (v: T): SchemaType; +>m2 : (v: T) => SchemaType +>v : T +} + +type SchemaType = S extends object ? AnySchema : never; +>SchemaType : SchemaType + +interface AnySchema extends AnySchemaType, V> { } +interface AnySchemaType, V> extends AbstractSchema { } + diff --git a/tests/cases/compiler/conditionalTypeSimplification.ts b/tests/cases/compiler/conditionalTypeSimplification.ts new file mode 100644 index 0000000000000..74c4d95045115 --- /dev/null +++ b/tests/cases/compiler/conditionalTypeSimplification.ts @@ -0,0 +1,10 @@ +// Repro from #30794 + +interface AbstractSchema { + m1 (v: T): SchemaType>; + m2 (v: T): SchemaType; +} + +type SchemaType = S extends object ? AnySchema : never; +interface AnySchema extends AnySchemaType, V> { } +interface AnySchemaType, V> extends AbstractSchema { }