From b330fbce4deeab765ac3fa3b9ad07db282b92e27 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Sat, 30 Sep 2023 00:54:10 -0700 Subject: [PATCH 1/2] Bail early in getNarrowedTypeWorker if type is candidate --- src/compiler/checker.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 58d6a8b867e20..3c817e95708eb 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -28163,6 +28163,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (type.flags & TypeFlags.AnyOrUnknown) { return candidate; } + + // TODO(jakebailey): should this just be type === candidate? + if (isTypeIdenticalTo(type, candidate)) { + return candidate; + } + // We first attempt to filter the current type, narrowing constituents as appropriate and removing // constituents that are unrelated to the candidate. const isRelated = checkDerived ? isTypeDerivedFrom : isTypeSubtypeOf; From 1c14f5cfbe603954e7d804c12335faf58216cd72 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Sun, 1 Oct 2023 20:36:31 -0700 Subject: [PATCH 2/2] And in negative case, use equality --- src/compiler/checker.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3c817e95708eb..8e5a04d629c7f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -28154,6 +28154,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { function getNarrowedTypeWorker(type: Type, candidate: Type, assumeTrue: boolean, checkDerived: boolean) { if (!assumeTrue) { + if (type === candidate) { + return neverType; + } if (checkDerived) { return filterType(type, t => !isTypeDerivedFrom(t, candidate)); } @@ -28163,9 +28166,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (type.flags & TypeFlags.AnyOrUnknown) { return candidate; } - - // TODO(jakebailey): should this just be type === candidate? - if (isTypeIdenticalTo(type, candidate)) { + if (type === candidate) { return candidate; }