From fbca3847caef60452d7e38b9eca65c992f7cb4c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Mon, 7 Sep 2026 11:22:11 +0200 Subject: [PATCH] Skip object classification for shared type facts --- tsc/internal/checker/checker.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tsc/internal/checker/checker.go b/tsc/internal/checker/checker.go index ca77e97af8547..e9374fd6f9dda 100644 --- a/tsc/internal/checker/checker.go +++ b/tsc/internal/checker/checker.go @@ -31402,16 +31402,17 @@ func (c *Checker) getTypeFactsWorker(t *Type, callerOnlyNeeds TypeFacts) TypeFac } return TypeFactsTrueFacts case flags&TypeFlagsObject != 0: - var possibleFacts TypeFacts + var possibleFacts, commonFacts TypeFacts if c.strictNullChecks { possibleFacts = TypeFactsEmptyObjectStrictFacts | TypeFactsFunctionStrictFacts | TypeFactsObjectStrictFacts + commonFacts = TypeFactsEmptyObjectStrictFacts & TypeFactsFunctionStrictFacts & TypeFactsObjectStrictFacts } else { possibleFacts = TypeFactsEmptyObjectFacts | TypeFactsFunctionFacts | TypeFactsObjectFacts + commonFacts = TypeFactsEmptyObjectFacts & TypeFactsFunctionFacts & TypeFactsObjectFacts } - if (callerOnlyNeeds & possibleFacts) == 0 { - // If the caller doesn't care about any of the facts that we could possibly produce, - // return zero so we can skip resolving members. - return TypeFactsNone + if callerOnlyNeeds&(possibleFacts&^commonFacts) == 0 { + // If the requested facts don't distinguish between object kinds, skip classifying the object. + return commonFacts } switch { case t.objectFlags&ObjectFlagsAnonymous != 0 && c.isEmptyObjectType(t):