mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-15 12:51:30 -05:00
Cache isWeakType computation
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user