@@ -5335,9 +5335,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
53355335
53365336 function createIntrinsicType(kind: TypeFlags, intrinsicName: string, objectFlags = ObjectFlags.None, debugIntrinsicName?: string): IntrinsicType {
53375337 checkIntrinsicName(intrinsicName, debugIntrinsicName);
5338- const type = createType(kind) as IntrinsicType;
5339- type.intrinsicName = intrinsicName;
5340- type.debugIntrinsicName = debugIntrinsicName;
5338+ const type = createType(kind) as TypeWithData< IntrinsicType> ;
5339+ type.data. intrinsicName = intrinsicName;
5340+ type.data. debugIntrinsicName = debugIntrinsicName;
53415341 type.objectFlags = objectFlags | ObjectFlags.CouldContainTypeVariablesComputed | ObjectFlags.IsGenericTypeComputed | ObjectFlags.IsUnknownLikeUnionComputed | ObjectFlags.IsNeverIntersectionComputed;
53425342 return type;
53435343 }
@@ -5349,15 +5349,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
53495349 }
53505350 seenIntrinsicNames.add(key);
53515351 }
5352-
5352+ type TypeWithData<T> = T & { data: Omit<T, "flags" | "objectFlags" | "symbol" | "id" | "checker">; };
53535353 function createObjectType(objectFlags: ObjectFlags, symbol?: Symbol): ObjectType {
5354- const type = createTypeWithSymbol(TypeFlags.Object, symbol!) as ObjectType;
5354+ const type = createTypeWithSymbol(TypeFlags.Object, symbol!) as TypeWithData< ObjectType> ;
53555355 type.objectFlags = objectFlags;
5356- type.members = undefined;
5357- type.properties = undefined;
5358- type.callSignatures = undefined;
5359- type.constructSignatures = undefined;
5360- type.indexInfos = undefined;
5356+ type.data. members = undefined;
5357+ type.data. properties = undefined;
5358+ type.data. callSignatures = undefined;
5359+ type.data. constructSignatures = undefined;
5360+ type.data. indexInfos = undefined;
53615361 return type;
53625362 }
53635363
@@ -5402,14 +5402,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
54025402 }
54035403
54045404 function setStructuredTypeMembers(type: StructuredType, members: SymbolTable, callSignatures: readonly Signature[], constructSignatures: readonly Signature[], indexInfos: readonly IndexInfo[]): ResolvedType {
5405- const resolved = type as ResolvedType;
5406- resolved.members = members;
5407- resolved.properties = emptyArray;
5408- resolved.callSignatures = callSignatures;
5409- resolved.constructSignatures = constructSignatures;
5410- resolved.indexInfos = indexInfos;
5405+ const resolved = type as TypeWithData< ResolvedType> ;
5406+ resolved.data. members = members;
5407+ resolved.data. properties = emptyArray;
5408+ resolved.data. callSignatures = callSignatures;
5409+ resolved.data. constructSignatures = constructSignatures;
5410+ resolved.data. indexInfos = indexInfos;
54115411 // This can loop back to getPropertyOfType() which would crash if `callSignatures` & `constructSignatures` are not initialized.
5412- if (members !== emptySymbols) resolved.properties = getNamedMembers(members);
5412+ if (members !== emptySymbols) resolved.data. properties = getNamedMembers(members);
54135413 return resolved;
54145414 }
54155415
@@ -13019,13 +13019,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1301913019 return links.declaredType;
1302013020 }
1302113021
13022- function createComputedEnumType(symbol: Symbol) {
13023- const regularType = createTypeWithSymbol(TypeFlags.Enum, symbol) as EnumType;
13024- const freshType = createTypeWithSymbol(TypeFlags.Enum, symbol) as EnumType;
13025- regularType.regularType = regularType;
13026- regularType.freshType = freshType;
13027- freshType.regularType = regularType;
13028- freshType.freshType = freshType;
13022+ function createComputedEnumType(symbol: Symbol): EnumType {
13023+ const regularType = createTypeWithSymbol(TypeFlags.Enum, symbol) as TypeWithData< EnumType> ;
13024+ const freshType = createTypeWithSymbol(TypeFlags.Enum, symbol) as TypeWithData< EnumType> ;
13025+ regularType.data. regularType = regularType;
13026+ regularType.data. freshType = freshType;
13027+ freshType.data. regularType = regularType;
13028+ freshType.data. freshType = freshType;
1302913029 return regularType;
1303013030 }
1303113031
@@ -16258,22 +16258,22 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1625816258
1625916259 function createTypeReference(target: GenericType, typeArguments: readonly Type[] | undefined): TypeReference {
1626016260 const id = getTypeListId(typeArguments);
16261- let type = target.instantiations.get(id);
16261+ let type = target.instantiations.get(id) as TypeWithData<TypeReference> ;
1626216262 if (!type) {
16263- type = createObjectType(ObjectFlags.Reference, target.symbol) as TypeReference;
16263+ type = createObjectType(ObjectFlags.Reference, target.symbol) as TypeWithData< TypeReference> ;
1626416264 target.instantiations.set(id, type);
1626516265 type.objectFlags |= typeArguments ? getPropagatingFlagsOfTypes(typeArguments) : 0;
16266- type.target = target;
16267- type.resolvedTypeArguments = typeArguments;
16266+ type.data. target = target;
16267+ type.data. resolvedTypeArguments = typeArguments;
1626816268 }
1626916269 return type;
1627016270 }
1627116271
1627216272 function cloneTypeReference(source: TypeReference): TypeReference {
16273- const type = createTypeWithSymbol(source.flags, source.symbol) as TypeReference;
16273+ const type = createTypeWithSymbol(source.flags, source.symbol) as TypeWithData< TypeReference> ;
1627416274 type.objectFlags = source.objectFlags;
16275- type.target = source.target;
16276- type.resolvedTypeArguments = source.resolvedTypeArguments;
16275+ type.data. target = source.target;
16276+ type.data. resolvedTypeArguments = source.resolvedTypeArguments;
1627716277 return type;
1627816278 }
1627916279
@@ -16283,12 +16283,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1628316283 const localAliasTypeArguments = getTypeArgumentsForAliasSymbol(aliasSymbol);
1628416284 aliasTypeArguments = mapper ? instantiateTypes(localAliasTypeArguments, mapper) : localAliasTypeArguments;
1628516285 }
16286- const type = createObjectType(ObjectFlags.Reference, target.symbol) as DeferredTypeReference;
16287- type.target = target;
16288- type.node = node;
16289- type.mapper = mapper;
16290- type.aliasSymbol = aliasSymbol;
16291- type.aliasTypeArguments = aliasTypeArguments;
16286+ const type = createObjectType(ObjectFlags.Reference, target.symbol) as TypeWithData< DeferredTypeReference> ;
16287+ type.data. target = target;
16288+ type.data. node = node;
16289+ type.data. mapper = mapper;
16290+ type.data. aliasSymbol = aliasSymbol;
16291+ type.data. aliasTypeArguments = aliasTypeArguments;
1629216292 return type;
1629316293 }
1629416294
@@ -17206,28 +17206,28 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1720617206 lengthSymbol.links.type = getUnionType(literalTypes);
1720717207 }
1720817208 properties.push(lengthSymbol);
17209- const type = createObjectType(ObjectFlags.Tuple | ObjectFlags.Reference) as TupleType & InterfaceTypeWithDeclaredMembers;
17210- type.typeParameters = typeParameters;
17211- type.outerTypeParameters = undefined;
17212- type.localTypeParameters = typeParameters;
17213- type.instantiations = new Map<string, TypeReference>();
17214- type.instantiations.set(getTypeListId(type.typeParameters), type as GenericType);
17215- type.target = type as GenericType;
17216- type.resolvedTypeArguments = type.typeParameters;
17217- type.thisType = createTypeParameter();
17218- type.thisType.isThisType = true;
17219- type.thisType.constraint = type;
17220- type.declaredProperties = properties;
17221- type.declaredCallSignatures = emptyArray;
17222- type.declaredConstructSignatures = emptyArray;
17223- type.declaredIndexInfos = emptyArray;
17224- type.elementFlags = elementFlags;
17225- type.minLength = minLength;
17226- type.fixedLength = fixedLength;
17227- type.hasRestElement = !!(combinedFlags & ElementFlags.Variable);
17228- type.combinedFlags = combinedFlags;
17229- type.readonly = readonly;
17230- type.labeledElementDeclarations = namedMemberDeclarations;
17209+ const type = createObjectType(ObjectFlags.Tuple | ObjectFlags.Reference) as TypeWithData< TupleType & InterfaceTypeWithDeclaredMembers> ;
17210+ type.data. typeParameters = typeParameters;
17211+ type.data. outerTypeParameters = undefined;
17212+ type.data. localTypeParameters = typeParameters;
17213+ type.data. instantiations = new Map<string, TypeReference>();
17214+ type.data. instantiations.set(getTypeListId(type.typeParameters), type as GenericType);
17215+ type.data. target = type as GenericType;
17216+ type.data. resolvedTypeArguments = type.typeParameters;
17217+ type.data. thisType = createTypeParameter();
17218+ type.data. thisType.isThisType = true;
17219+ type.data. thisType.constraint = type;
17220+ type.data. declaredProperties = properties;
17221+ type.data. declaredCallSignatures = emptyArray;
17222+ type.data. declaredConstructSignatures = emptyArray;
17223+ type.data. declaredIndexInfos = emptyArray;
17224+ type.data. elementFlags = elementFlags;
17225+ type.data. minLength = minLength;
17226+ type.data. fixedLength = fixedLength;
17227+ type.data. hasRestElement = !!(combinedFlags & ElementFlags.Variable);
17228+ type.data. combinedFlags = combinedFlags;
17229+ type.data. readonly = readonly;
17230+ type.data. labeledElementDeclarations = namedMemberDeclarations;
1723117231 return type;
1723217232 }
1723317233
@@ -17925,12 +17925,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1792517925 return true;
1792617926 }
1792717927
17928- function createIntersectionType(types: Type[], objectFlags: ObjectFlags, aliasSymbol?: Symbol, aliasTypeArguments?: readonly Type[]) {
17929- const result = createType(TypeFlags.Intersection) as IntersectionType;
17928+ function createIntersectionType(types: Type[], objectFlags: ObjectFlags, aliasSymbol?: Symbol, aliasTypeArguments?: readonly Type[]): IntersectionType {
17929+ const result = createType(TypeFlags.Intersection) as TypeWithData< IntersectionType> ;
1793017930 result.objectFlags = objectFlags | getPropagatingFlagsOfTypes(types, /*excludeKinds*/ TypeFlags.Nullable);
17931- result.types = types;
17932- result.aliasSymbol = aliasSymbol;
17933- result.aliasTypeArguments = aliasTypeArguments;
17931+ result.data. types = types;
17932+ result.data. aliasSymbol = aliasSymbol;
17933+ result.data. aliasTypeArguments = aliasTypeArguments;
1793417934 return result;
1793517935 }
1793617936
@@ -18143,16 +18143,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1814318143 return links.resolvedType;
1814418144 }
1814518145
18146- function createIndexType(type: InstantiableType | UnionOrIntersectionType, indexFlags: IndexFlags) {
18147- const result = createType(TypeFlags.Index) as IndexType;
18148- result.type = type;
18149- result.indexFlags = indexFlags;
18146+ function createIndexType(type: InstantiableType | UnionOrIntersectionType, indexFlags: IndexFlags): IndexType {
18147+ const result = createType(TypeFlags.Index) as TypeWithData< IndexType> ;
18148+ result.data. type = type;
18149+ result.data. indexFlags = indexFlags;
1815018150 return result;
1815118151 }
1815218152
18153- function createOriginIndexType(type: InstantiableType | UnionOrIntersectionType) {
18154- const result = createOriginType(TypeFlags.Index) as IndexType;
18155- result.type = type;
18153+ function createOriginIndexType(type: InstantiableType | UnionOrIntersectionType): IndexType {
18154+ const result = createOriginType(TypeFlags.Index) as TypeWithData< IndexType> ;
18155+ result.data. type = type;
1815618156 return result;
1815718157 }
1815818158
@@ -18413,10 +18413,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1841318413 undefined;
1841418414 }
1841518415
18416- function createTemplateLiteralType(texts: readonly string[], types: readonly Type[]) {
18417- const type = createType(TypeFlags.TemplateLiteral) as TemplateLiteralType;
18418- type.texts = texts;
18419- type.types = types;
18416+ function createTemplateLiteralType(texts: readonly string[], types: readonly Type[]): TemplateLiteralType {
18417+ const type = createType(TypeFlags.TemplateLiteral) as TypeWithData< TemplateLiteralType> ;
18418+ type.data. texts = texts;
18419+ type.data. types = types;
1842018420 return type;
1842118421 }
1842218422
@@ -18469,19 +18469,19 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1846918469 return result;
1847018470 }
1847118471
18472- function createStringMappingType(symbol: Symbol, type: Type) {
18473- const result = createTypeWithSymbol(TypeFlags.StringMapping, symbol) as StringMappingType;
18474- result.type = type;
18472+ function createStringMappingType(symbol: Symbol, type: Type): StringMappingType {
18473+ const result = createTypeWithSymbol(TypeFlags.StringMapping, symbol) as TypeWithData< StringMappingType> ;
18474+ result.data. type = type;
1847518475 return result;
1847618476 }
1847718477
18478- function createIndexedAccessType(objectType: Type, indexType: Type, accessFlags: AccessFlags, aliasSymbol: Symbol | undefined, aliasTypeArguments: readonly Type[] | undefined) {
18479- const type = createType(TypeFlags.IndexedAccess) as IndexedAccessType;
18478+ function createIndexedAccessType(objectType: Type, indexType: Type, accessFlags: AccessFlags, aliasSymbol: Symbol | undefined, aliasTypeArguments: readonly Type[] | undefined): IndexedAccessType {
18479+ const type = createType(TypeFlags.IndexedAccess) as TypeWithData< IndexedAccessType> ;
1848018480 type.objectType = objectType;
18481- type.indexType = indexType;
18482- type.accessFlags = accessFlags;
18483- type.aliasSymbol = aliasSymbol;
18484- type.aliasTypeArguments = aliasTypeArguments;
18481+ type.data. indexType = indexType;
18482+ type.data. accessFlags = accessFlags;
18483+ type.data. aliasSymbol = aliasSymbol;
18484+ type.data. aliasTypeArguments = aliasTypeArguments;
1848518485 return type;
1848618486 }
1848718487
@@ -19568,10 +19568,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1956819568 return info.isReadonly !== readonly ? createIndexInfo(info.keyType, info.type, readonly, info.declaration) : info;
1956919569 }
1957019570
19571- function createLiteralType(flags: TypeFlags, value: string | number | PseudoBigInt, symbol?: Symbol, regularType?: LiteralType) {
19572- const type = createTypeWithSymbol(flags, symbol!) as LiteralType;
19573- type.value = value;
19574- type.regularType = regularType || type;
19571+ function createLiteralType(flags: TypeFlags, value: string | number | PseudoBigInt, symbol?: Symbol, regularType?: LiteralType): LiteralType {
19572+ const type = createTypeWithSymbol(flags, symbol!) as TypeWithData< LiteralType> ;
19573+ type.data. value = value;
19574+ type.data. regularType = regularType || type;
1957519575 return type;
1957619576 }
1957719577
@@ -19635,9 +19635,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1963519635 return links.resolvedType;
1963619636 }
1963719637
19638- function createUniqueESSymbolType(symbol: Symbol) {
19639- const type = createTypeWithSymbol(TypeFlags.UniqueESSymbol, symbol) as UniqueESSymbolType;
19640- type.escapedName = `__@${type.symbol.escapedName}@${getSymbolId(type.symbol)}` as __String;
19638+ function createUniqueESSymbolType(symbol: Symbol): UniqueESSymbolType {
19639+ const type = createTypeWithSymbol(TypeFlags.UniqueESSymbol, symbol) as TypeWithData< UniqueESSymbolType> ;
19640+ type.data. escapedName = `__@${type.symbol.escapedName}@${getSymbolId(type.symbol)}` as __String;
1964119641 return type;
1964219642 }
1964319643
@@ -25681,10 +25681,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2568125681 }
2568225682 // For all other object types we infer a new object type where the reverse mapping has been
2568325683 // applied to the type of each property.
25684- const reversed = createObjectType(ObjectFlags.ReverseMapped | ObjectFlags.Anonymous, /*symbol*/ undefined) as ReverseMappedType;
25685- reversed.source = source;
25686- reversed.mappedType = target;
25687- reversed.constraintType = constraint;
25684+ const reversed = createObjectType(ObjectFlags.ReverseMapped | ObjectFlags.Anonymous, /*symbol*/ undefined) as TypeWithData< ReverseMappedType> ;
25685+ reversed.data. source = source;
25686+ reversed.data. mappedType = target;
25687+ reversed.data. constraintType = constraint;
2568825688 return reversed;
2568925689 }
2569025690
@@ -27807,8 +27807,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2780727807 // array types are ultimately converted into manifest array types (using getFinalArrayType)
2780827808 // and never escape the getFlowTypeOfReference function.
2780927809 function createEvolvingArrayType(elementType: Type): EvolvingArrayType {
27810- const result = createObjectType(ObjectFlags.EvolvingArray) as EvolvingArrayType;
27811- result.elementType = elementType;
27810+ const result = createObjectType(ObjectFlags.EvolvingArray) as TypeWithData< EvolvingArrayType> ;
27811+ result.data. elementType = elementType;
2781227812 return result;
2781327813 }
2781427814
0 commit comments