From 25a71c4de61f6366ffac080d19685dcb200f42b9 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Tue, 8 Feb 2022 10:43:17 -0500 Subject: [PATCH] Cache isWeakType computation --- src/compiler/checker.ts | 21 ++++++++++++++------- src/compiler/types.ts | 6 ++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b9698d23e8a..cf7f65f37b9 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -20258,15 +20258,22 @@ namespace ts { * and no required properties, call/construct signatures or index signatures */ function isWeakType(type: Type): boolean { - if (type.flags & TypeFlags.Object) { - const resolved = resolveStructuredTypeMembers(type as ObjectType); - return resolved.callSignatures.length === 0 && resolved.constructSignatures.length === 0 && resolved.indexInfos.length === 0 && - resolved.properties.length > 0 && every(resolved.properties, p => !!(p.flags & SymbolFlags.Optional)); + if (!(type.flags & (TypeFlags.Object | TypeFlags.Intersection))) { + return false; } - if (type.flags & TypeFlags.Intersection) { - return every((type as IntersectionType).types, isWeakType); + if (!((type as ObjectType | IntersectionType).objectFlags & ObjectFlags.IsWeakTypeComputed)) { + let isWeak; + if (type.flags & TypeFlags.Object) { + const resolved = resolveStructuredTypeMembers(type as ObjectType); + isWeak = resolved.callSignatures.length === 0 && resolved.constructSignatures.length === 0 && resolved.indexInfos.length === 0 && + resolved.properties.length > 0 && every(resolved.properties, p => !!(p.flags & SymbolFlags.Optional)); + } + else { + isWeak = every((type as IntersectionType).types, isWeakType); + } + (type as ObjectType | IntersectionType).objectFlags |= ObjectFlags.IsWeakTypeComputed | (isWeak ? ObjectFlags.IsWeakType : 0); } - return false; + return !!((type as ObjectType | IntersectionType).objectFlags & ObjectFlags.IsWeakType); } function hasCommonProperties(source: Type, target: Type, isComparingJsxAttributes: boolean) { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 5cabf3edef8..05ac24af6e2 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -5360,6 +5360,12 @@ namespace ts { IsNeverIntersectionComputed = 1 << 25, // IsNeverLike flag has been computed /* @internal */ IsNeverIntersection = 1 << 26, // Intersection reduces to never + + // Flags that require TypeFlags.Object or TypeFlags.Intersection + /* @internal */ + IsWeakTypeComputed = 1 << 27, + /* @internal */ + IsWeakType = 1 << 28, } /* @internal */