Skip to content

Commit 25a71c4

Browse files
committed
Cache isWeakType computation
1 parent 530c876 commit 25a71c4

File tree

2 files changed

+20
-7
lines changed

2 files changed

+20
-7
lines changed

Diff for: src/compiler/checker.ts

+14-7
Original file line numberDiff line numberDiff line change
@@ -20258,15 +20258,22 @@ namespace ts {
2025820258
* and no required properties, call/construct signatures or index signatures
2025920259
*/
2026020260
function isWeakType(type: Type): boolean {
20261-
if (type.flags & TypeFlags.Object) {
20262-
const resolved = resolveStructuredTypeMembers(type as ObjectType);
20263-
return resolved.callSignatures.length === 0 && resolved.constructSignatures.length === 0 && resolved.indexInfos.length === 0 &&
20264-
resolved.properties.length > 0 && every(resolved.properties, p => !!(p.flags & SymbolFlags.Optional));
20261+
if (!(type.flags & (TypeFlags.Object | TypeFlags.Intersection))) {
20262+
return false;
2026520263
}
20266-
if (type.flags & TypeFlags.Intersection) {
20267-
return every((type as IntersectionType).types, isWeakType);
20264+
if (!((type as ObjectType | IntersectionType).objectFlags & ObjectFlags.IsWeakTypeComputed)) {
20265+
let isWeak;
20266+
if (type.flags & TypeFlags.Object) {
20267+
const resolved = resolveStructuredTypeMembers(type as ObjectType);
20268+
isWeak = resolved.callSignatures.length === 0 && resolved.constructSignatures.length === 0 && resolved.indexInfos.length === 0 &&
20269+
resolved.properties.length > 0 && every(resolved.properties, p => !!(p.flags & SymbolFlags.Optional));
20270+
}
20271+
else {
20272+
isWeak = every((type as IntersectionType).types, isWeakType);
20273+
}
20274+
(type as ObjectType | IntersectionType).objectFlags |= ObjectFlags.IsWeakTypeComputed | (isWeak ? ObjectFlags.IsWeakType : 0);
2026820275
}
20269-
return false;
20276+
return !!((type as ObjectType | IntersectionType).objectFlags & ObjectFlags.IsWeakType);
2027020277
}
2027120278

2027220279
function hasCommonProperties(source: Type, target: Type, isComparingJsxAttributes: boolean) {

Diff for: src/compiler/types.ts

+6
Original file line numberDiff line numberDiff line change
@@ -5360,6 +5360,12 @@ namespace ts {
53605360
IsNeverIntersectionComputed = 1 << 25, // IsNeverLike flag has been computed
53615361
/* @internal */
53625362
IsNeverIntersection = 1 << 26, // Intersection reduces to never
5363+
5364+
// Flags that require TypeFlags.Object or TypeFlags.Intersection
5365+
/* @internal */
5366+
IsWeakTypeComputed = 1 << 27,
5367+
/* @internal */
5368+
IsWeakType = 1 << 28,
53635369
}
53645370

53655371
/* @internal */

0 commit comments

Comments
 (0)