From b83148fe64111b3add3d2fea9f39d17694928285 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Wed, 5 May 2021 13:33:45 -0700 Subject: [PATCH] Unwrap substitutions on conditional check types before comparing them (#43888) --- src/compiler/checker.ts | 2 +- .../curiousNestedConditionalEvaluationResult.js | 7 +++++++ .../curiousNestedConditionalEvaluationResult.symbols | 11 +++++++++++ .../curiousNestedConditionalEvaluationResult.types | 10 ++++++++++ .../curiousNestedConditionalEvaluationResult.ts | 4 ++++ 5 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/curiousNestedConditionalEvaluationResult.js create mode 100644 tests/baselines/reference/curiousNestedConditionalEvaluationResult.symbols create mode 100644 tests/baselines/reference/curiousNestedConditionalEvaluationResult.types create mode 100644 tests/cases/compiler/curiousNestedConditionalEvaluationResult.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 72251594841..4bef5f6a7cc 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15022,7 +15022,7 @@ namespace ts { // purposes of resolution. This means such types aren't subject to the instatiation depth limiter. while (true) { const isUnwrapped = isTypicalNondistributiveConditional(root); - const checkType = instantiateType(unwrapNondistributiveConditionalTuple(root, root.checkType), mapper); + const checkType = instantiateType(unwrapNondistributiveConditionalTuple(root, getActualTypeVariable(root.checkType)), mapper); const checkTypeInstantiable = isGenericObjectType(checkType) || isGenericIndexType(checkType); const extendsType = instantiateType(unwrapNondistributiveConditionalTuple(root, root.extendsType), mapper); if (checkType === wildcardType || extendsType === wildcardType) { diff --git a/tests/baselines/reference/curiousNestedConditionalEvaluationResult.js b/tests/baselines/reference/curiousNestedConditionalEvaluationResult.js new file mode 100644 index 00000000000..c2b09567a59 --- /dev/null +++ b/tests/baselines/reference/curiousNestedConditionalEvaluationResult.js @@ -0,0 +1,7 @@ +//// [curiousNestedConditionalEvaluationResult.ts] +// regression test for #43123 +type Hmm = [0] extends [infer T, any?] ? + [T, [0] extends [T] ? true : false] + : never + +//// [curiousNestedConditionalEvaluationResult.js] diff --git a/tests/baselines/reference/curiousNestedConditionalEvaluationResult.symbols b/tests/baselines/reference/curiousNestedConditionalEvaluationResult.symbols new file mode 100644 index 00000000000..f88f243aa8d --- /dev/null +++ b/tests/baselines/reference/curiousNestedConditionalEvaluationResult.symbols @@ -0,0 +1,11 @@ +=== tests/cases/compiler/curiousNestedConditionalEvaluationResult.ts === +// regression test for #43123 +type Hmm = [0] extends [infer T, any?] ? +>Hmm : Symbol(Hmm, Decl(curiousNestedConditionalEvaluationResult.ts, 0, 0)) +>T : Symbol(T, Decl(curiousNestedConditionalEvaluationResult.ts, 1, 29)) + + [T, [0] extends [T] ? true : false] +>T : Symbol(T, Decl(curiousNestedConditionalEvaluationResult.ts, 1, 29)) +>T : Symbol(T, Decl(curiousNestedConditionalEvaluationResult.ts, 1, 29)) + + : never diff --git a/tests/baselines/reference/curiousNestedConditionalEvaluationResult.types b/tests/baselines/reference/curiousNestedConditionalEvaluationResult.types new file mode 100644 index 00000000000..1a685371462 --- /dev/null +++ b/tests/baselines/reference/curiousNestedConditionalEvaluationResult.types @@ -0,0 +1,10 @@ +=== tests/cases/compiler/curiousNestedConditionalEvaluationResult.ts === +// regression test for #43123 +type Hmm = [0] extends [infer T, any?] ? +>Hmm : [0, true] + + [T, [0] extends [T] ? true : false] +>true : true +>false : false + + : never diff --git a/tests/cases/compiler/curiousNestedConditionalEvaluationResult.ts b/tests/cases/compiler/curiousNestedConditionalEvaluationResult.ts new file mode 100644 index 00000000000..26784d46659 --- /dev/null +++ b/tests/cases/compiler/curiousNestedConditionalEvaluationResult.ts @@ -0,0 +1,4 @@ +// regression test for #43123 +type Hmm = [0] extends [infer T, any?] ? + [T, [0] extends [T] ? true : false] + : never \ No newline at end of file