From 4c6ac3e211b090a35cd80623fa1cc49d83a22415 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Tue, 16 Apr 2019 11:02:46 -0700 Subject: [PATCH] Port PR #30877 (#30904) Ports #30877 to release-3.4 --- src/compiler/checker.ts | 4 +- .../conditionalTypeSimplification.js | 15 ++++++ .../conditionalTypeSimplification.symbols | 53 +++++++++++++++++++ .../conditionalTypeSimplification.types | 19 +++++++ .../compiler/conditionalTypeSimplification.ts | 10 ++++ 5 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/conditionalTypeSimplification.js create mode 100644 tests/baselines/reference/conditionalTypeSimplification.symbols create mode 100644 tests/baselines/reference/conditionalTypeSimplification.types create mode 100644 tests/cases/compiler/conditionalTypeSimplification.ts 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 { }