From 27bec2a0f3959baf1f702981c9817032d646e7dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Wed, 4 Jun 2025 16:21:29 +0200 Subject: [PATCH] Port `Improve `unknown` narrowing by negated type predicates` --- internal/checker/flow.go | 7 +++++-- .../narrowUnknownByTypePredicate.types | 4 ++-- .../narrowUnknownByTypePredicate.types.diff | 20 ------------------- 3 files changed, 7 insertions(+), 24 deletions(-) delete mode 100644 testdata/baselines/reference/submodule/compiler/narrowUnknownByTypePredicate.types.diff diff --git a/internal/checker/flow.go b/internal/checker/flow.go index 4ef3469f75..25a28bcca2 100644 --- a/internal/checker/flow.go +++ b/internal/checker/flow.go @@ -841,10 +841,13 @@ func (c *Checker) getNarrowedTypeWorker(t *Type, candidate *Type, assumeTrue boo return !c.isTypeDerivedFrom(t, candidate) }) } + if t.flags&TypeFlagsUnknown != 0 { + t = c.unknownUnionType + } trueType := c.getNarrowedType(t, candidate, true /*assumeTrue*/, false /*checkDerived*/) - return c.filterType(t, func(t *Type) bool { + return c.recombineUnknownType(c.filterType(t, func(t *Type) bool { return !c.isTypeSubsetOf(t, trueType) - }) + })) } if t.flags&TypeFlagsAnyOrUnknown != 0 { return candidate diff --git a/testdata/baselines/reference/submodule/compiler/narrowUnknownByTypePredicate.types b/testdata/baselines/reference/submodule/compiler/narrowUnknownByTypePredicate.types index d9f250bdb6..26d83a9a43 100644 --- a/testdata/baselines/reference/submodule/compiler/narrowUnknownByTypePredicate.types +++ b/testdata/baselines/reference/submodule/compiler/narrowUnknownByTypePredicate.types @@ -31,7 +31,7 @@ if (!isNotNullish(value2)) { >value2 : unknown value2; ->value2 : unknown +>value2 : null | undefined } declare const value3: unknown; @@ -56,7 +56,7 @@ if (!isNullish(value4)) { >value4 : unknown value4; ->value4 : unknown +>value4 : {} } declare class A { foo: string; } diff --git a/testdata/baselines/reference/submodule/compiler/narrowUnknownByTypePredicate.types.diff b/testdata/baselines/reference/submodule/compiler/narrowUnknownByTypePredicate.types.diff deleted file mode 100644 index 5425029a9a..0000000000 --- a/testdata/baselines/reference/submodule/compiler/narrowUnknownByTypePredicate.types.diff +++ /dev/null @@ -1,20 +0,0 @@ ---- old.narrowUnknownByTypePredicate.types -+++ new.narrowUnknownByTypePredicate.types -@@= skipped -30, +30 lines =@@ - >value2 : unknown - - value2; -->value2 : null | undefined -+>value2 : unknown - } - - declare const value3: unknown; -@@= skipped -25, +25 lines =@@ - >value4 : unknown - - value4; -->value4 : {} -+>value4 : unknown - } - - declare class A { foo: string; } \ No newline at end of file