Skip to content

Commit c6d0ad8

Browse files
michaelfigcodex
andcommitted
Represent deferred registered symbols with a distinct type flag
Avoid assigning a unique symbol identity to Symbol.for calls with unresolved keys. Add a regression case for indexed access through two generic registry keys. Co-authored-by: Codex <codex@openai.com>
1 parent 9d2d9e6 commit c6d0ad8

12 files changed

Lines changed: 323 additions & 60 deletions

File tree

‎packages/typescript/src/enums/typeFlags.enum.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export enum TypeFlags {
3333
Intersection = 1 << 28,
3434
Reserved1 = 1 << 29,
3535
Reserved2 = 1 << 30,
36-
Reserved3 = 1 << 31,
36+
RegisteredESSymbol = 1 << 31,
3737
AnyOrUnknown = Any | Unknown,
3838
Nullable = Undefined | Null,
3939
Literal = StringLiteral | NumberLiteral | BigIntLiteral | BooleanLiteral,
@@ -49,7 +49,7 @@ export enum TypeFlags {
4949
BigIntLike = BigInt | BigIntLiteral,
5050
BooleanLike = Boolean | BooleanLiteral,
5151
EnumLike = Enum | EnumLiteral,
52-
ESSymbolLike = ESSymbol | UniqueESSymbol,
52+
ESSymbolLike = ESSymbol | UniqueESSymbol | RegisteredESSymbol,
5353
VoidLike = Void | Undefined,
5454
Primitive = StringLike | NumberLike | BigIntLike | BooleanLike | EnumLike | ESSymbolLike | VoidLike | Null,
5555
DefinitelyNonNullable = StringLike | NumberLike | BigIntLike | BooleanLike | EnumLike | ESSymbolLike | Object | NonPrimitive,
@@ -58,14 +58,14 @@ export enum TypeFlags {
5858
StructuredType = Object | Union | Intersection,
5959
TypeVariable = TypeParameter | IndexedAccess,
6060
InstantiableNonPrimitive = TypeVariable | Conditional | Substitution,
61-
InstantiablePrimitive = Index | TemplateLiteral | StringMapping,
61+
InstantiablePrimitive = Index | TemplateLiteral | StringMapping | RegisteredESSymbol,
6262
Instantiable = InstantiableNonPrimitive | InstantiablePrimitive,
6363
StructuredOrInstantiable = StructuredType | Instantiable,
6464
ObjectFlagsType = Any | Nullable | Never | Object | Union | Intersection,
6565
Simplifiable = IndexedAccess | Conditional | Index,
6666
Singleton = Any | Unknown | String | Number | Boolean | BigInt | ESSymbol | Void | Undefined | Null | Never | NonPrimitive,
6767
Narrowable = Any | Unknown | StructuredOrInstantiable | StringLike | NumberLike | BigIntLike | BooleanLike | ESSymbol | UniqueESSymbol | NonPrimitive,
68-
IncludesMask = Any | Unknown | Primitive | Never | Object | Union | Intersection | NonPrimitive | TemplateLiteral | StringMapping,
68+
IncludesMask = Any | Unknown | Primitive | Never | Object | Union | Intersection | NonPrimitive | TemplateLiteral | StringMapping | RegisteredESSymbol,
6969
IncludesMissingType = TypeParameter,
7070
IncludesNonWideningType = Index,
7171
IncludesWildcard = IndexedAccess,

‎packages/typescript/src/enums/typeFlags.ts‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export var TypeFlags: any;
3333
TypeFlags[TypeFlags["Intersection"] = 268435456] = "Intersection";
3434
TypeFlags[TypeFlags["Reserved1"] = 536870912] = "Reserved1";
3535
TypeFlags[TypeFlags["Reserved2"] = 1073741824] = "Reserved2";
36-
TypeFlags[TypeFlags["Reserved3"] = -2147483648] = "Reserved3";
36+
TypeFlags[TypeFlags["RegisteredESSymbol"] = -2147483648] = "RegisteredESSymbol";
3737
TypeFlags[TypeFlags["AnyOrUnknown"] = 3] = "AnyOrUnknown";
3838
TypeFlags[TypeFlags["Nullable"] = 12] = "Nullable";
3939
TypeFlags[TypeFlags["Literal"] = 15360] = "Literal";
@@ -49,23 +49,23 @@ export var TypeFlags: any;
4949
TypeFlags[TypeFlags["BigIntLike"] = 4224] = "BigIntLike";
5050
TypeFlags[TypeFlags["BooleanLike"] = 8448] = "BooleanLike";
5151
TypeFlags[TypeFlags["EnumLike"] = 98304] = "EnumLike";
52-
TypeFlags[TypeFlags["ESSymbolLike"] = 16896] = "ESSymbolLike";
52+
TypeFlags[TypeFlags["ESSymbolLike"] = -2147466752] = "ESSymbolLike";
5353
TypeFlags[TypeFlags["VoidLike"] = 20] = "VoidLike";
54-
TypeFlags[TypeFlags["Primitive"] = 12713980] = "Primitive";
55-
TypeFlags[TypeFlags["DefinitelyNonNullable"] = 13893600] = "DefinitelyNonNullable";
56-
TypeFlags[TypeFlags["DisjointDomains"] = 12812284] = "DisjointDomains";
54+
TypeFlags[TypeFlags["Primitive"] = -2134769668] = "Primitive";
55+
TypeFlags[TypeFlags["DefinitelyNonNullable"] = -2133590048] = "DefinitelyNonNullable";
56+
TypeFlags[TypeFlags["DisjointDomains"] = -2134671364] = "DisjointDomains";
5757
TypeFlags[TypeFlags["UnionOrIntersection"] = 402653184] = "UnionOrIntersection";
5858
TypeFlags[TypeFlags["StructuredType"] = 403701760] = "StructuredType";
5959
TypeFlags[TypeFlags["TypeVariable"] = 34078720] = "TypeVariable";
6060
TypeFlags[TypeFlags["InstantiableNonPrimitive"] = 117964800] = "InstantiableNonPrimitive";
61-
TypeFlags[TypeFlags["InstantiablePrimitive"] = 14680064] = "InstantiablePrimitive";
62-
TypeFlags[TypeFlags["Instantiable"] = 132644864] = "Instantiable";
63-
TypeFlags[TypeFlags["StructuredOrInstantiable"] = 536346624] = "StructuredOrInstantiable";
61+
TypeFlags[TypeFlags["InstantiablePrimitive"] = -2132803584] = "InstantiablePrimitive";
62+
TypeFlags[TypeFlags["Instantiable"] = -2014838784] = "Instantiable";
63+
TypeFlags[TypeFlags["StructuredOrInstantiable"] = -1611137024] = "StructuredOrInstantiable";
6464
TypeFlags[TypeFlags["ObjectFlagsType"] = 403963917] = "ObjectFlagsType";
6565
TypeFlags[TypeFlags["Simplifiable"] = 102760448] = "Simplifiable";
6666
TypeFlags[TypeFlags["Singleton"] = 394239] = "Singleton";
67-
TypeFlags[TypeFlags["Narrowable"] = 536575971] = "Narrowable";
68-
TypeFlags[TypeFlags["IncludesMask"] = 416808959] = "IncludesMask";
67+
TypeFlags[TypeFlags["Narrowable"] = -1610907677] = "Narrowable";
68+
TypeFlags[TypeFlags["IncludesMask"] = -1730674689] = "IncludesMask";
6969
TypeFlags[TypeFlags["IncludesMissingType"] = 524288] = "IncludesMissingType";
7070
TypeFlags[TypeFlags["IncludesNonWideningType"] = 2097152] = "IncludesNonWideningType";
7171
TypeFlags[TypeFlags["IncludesWildcard"] = 33554432] = "IncludesWildcard";

‎tsc/internal/api/enum_values_generated.go‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎tsc/internal/checker/checker.go‎

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22637,7 +22637,7 @@ func (c *Checker) instantiateTypeWorker(t *Type, m *TypeMapper, alias *TypeAlias
2263722637
return c.getTemplateLiteralType(t.AsTemplateLiteralType().texts, c.instantiateTypes(t.AsTemplateLiteralType().types, m))
2263822638
case flags&TypeFlagsStringMapping != 0:
2263922639
return c.getStringMappingType(t.symbol, c.instantiateType(t.AsStringMappingType().target, m))
22640-
case flags&TypeFlagsUniqueESSymbol != 0 && isRegisteredSymbolAlias(t.alias):
22640+
case flags&TypeFlagsRegisteredESSymbol != 0:
2264122641
newAlias := c.instantiateTypeAlias(t.alias, m)
2264222642
return c.getRegisteredESSymbolType(newAlias.typeArguments[0], newAlias)
2264322643
case flags&TypeFlagsConditional != 0:
@@ -23374,6 +23374,9 @@ func (c *Checker) getESSymbolLikeTypeForNode(node *ast.Node) *Type {
2337423374
}
2337523375

2337623376
func (c *Checker) getRegisteredESSymbolType(keyType *Type, alias *TypeAlias) *Type {
23377+
if keyType.flags&TypeFlagsNever != 0 {
23378+
return c.neverType
23379+
}
2337723380
if keyType.flags&TypeFlagsUnion != 0 {
2337823381
members := make([]*Type, 0, len(keyType.Types()))
2337923382
for _, member := range keyType.Types() {
@@ -23385,17 +23388,20 @@ func (c *Checker) getRegisteredESSymbolType(keyType *Type, alias *TypeAlias) *Ty
2338523388
}
2338623389
return c.getUnionType(members)
2338723390
}
23388-
// Keep a type parameter deferred so instantiating Symbol.for's generic
23389-
// return type can resolve the actual key supplied at the call site.
2339023391
if keyType.flags&(TypeFlagsStringOrNumberLiteral|TypeFlagsTypeParameter) == 0 {
2339123392
return c.esSymbolType
2339223393
}
2339323394
key := c.getRegisteredESSymbolTypeKey(keyType)
2339423395
t := c.registeredESSymbolTypes[key]
2339523396
if t == nil {
23396-
name := ast.InternalSymbolNamePrefix + "@@" + c.getRegisteredESSymbolNameText(keyType)
23397-
symbol := c.newSymbol(ast.SymbolFlagsProperty, name)
23398-
t = c.newUniqueESSymbolType(symbol, name)
23397+
if keyType.flags&TypeFlagsTypeParameter != 0 {
23398+
data := &RegisteredESSymbolType{target: keyType}
23399+
t = c.newType(TypeFlagsRegisteredESSymbol, ObjectFlagsNone, data)
23400+
} else {
23401+
name := ast.InternalSymbolNamePrefix + "@@" + c.getRegisteredESSymbolNameText(keyType)
23402+
symbol := c.newSymbol(ast.SymbolFlagsProperty, name)
23403+
t = c.newUniqueESSymbolType(symbol, name)
23404+
}
2339923405
c.registeredESSymbolTypes[key] = t
2340023406
}
2340123407
t.alias = alias
@@ -27913,7 +27919,7 @@ func (c *Checker) getBaseConstraintOrType(t *Type) *Type {
2791327919
}
2791427920

2791527921
func (c *Checker) getBaseConstraintOfType(t *Type) *Type {
27916-
if t.flags&(TypeFlagsInstantiableNonPrimitive|TypeFlagsUnionOrIntersection|TypeFlagsTemplateLiteral|TypeFlagsStringMapping|TypeFlagsIndex) != 0 || c.isGenericTupleType(t) {
27922+
if t.flags&(TypeFlagsInstantiableNonPrimitive|TypeFlagsUnionOrIntersection|TypeFlagsTemplateLiteral|TypeFlagsStringMapping|TypeFlagsRegisteredESSymbol|TypeFlagsIndex) != 0 || c.isGenericTupleType(t) {
2791727923
constraint := c.getResolvedBaseConstraint(t, nil)
2791827924
if constraint != c.noConstraintType && constraint != c.circularConstraintType {
2791927925
return constraint
@@ -28026,6 +28032,8 @@ func (c *Checker) computeBaseConstraint(t *Type, stack []RecursionId) *Type {
2802628032
return c.getStringMappingType(t.symbol, constraint)
2802728033
}
2802828034
return c.stringType
28035+
case t.flags&TypeFlagsRegisteredESSymbol != 0:
28036+
return c.esSymbolType
2802928037
case t.flags&TypeFlagsIndexedAccess != 0:
2803028038
if c.isMappedTypeGenericIndexedAccess(t) {
2803128039
// For indexed access types of the form { [P in K]: E }[X], where K is non-generic and X is generic,

‎tsc/internal/checker/relater.go‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3397,6 +3397,8 @@ func (r *Relater) structuredTypeRelatedToWorker(source *Type, target *Type, repo
33973397
if source.AsStringMappingType().Symbol() == target.AsStringMappingType().Symbol() {
33983398
return r.isRelatedTo(source.AsStringMappingType().target, target.AsStringMappingType().target, RecursionFlagsBoth, false /*reportErrors*/)
33993399
}
3400+
case source.flags&TypeFlagsRegisteredESSymbol != 0:
3401+
return r.isRelatedTo(source.AsRegisteredESSymbolType().target, target.AsRegisteredESSymbolType().target, RecursionFlagsBoth, false /*reportErrors*/)
34003402
}
34013403
if source.flags&TypeFlagsObject == 0 {
34023404
return TernaryFalse

‎tsc/internal/checker/types.go‎

Lines changed: 49 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -437,39 +437,39 @@ type TypeFlags uint32
437437
// conditional types should sort last as those types are potentially recursive and possibly infinite.
438438

439439
const (
440-
TypeFlagsNone TypeFlags = 0
441-
TypeFlagsAny TypeFlags = 1 << 0
442-
TypeFlagsUnknown TypeFlags = 1 << 1
443-
TypeFlagsUndefined TypeFlags = 1 << 2
444-
TypeFlagsNull TypeFlags = 1 << 3
445-
TypeFlagsVoid TypeFlags = 1 << 4
446-
TypeFlagsString TypeFlags = 1 << 5
447-
TypeFlagsNumber TypeFlags = 1 << 6
448-
TypeFlagsBigInt TypeFlags = 1 << 7
449-
TypeFlagsBoolean TypeFlags = 1 << 8
450-
TypeFlagsESSymbol TypeFlags = 1 << 9 // Type of symbol primitive introduced in ES6
451-
TypeFlagsStringLiteral TypeFlags = 1 << 10
452-
TypeFlagsNumberLiteral TypeFlags = 1 << 11
453-
TypeFlagsBigIntLiteral TypeFlags = 1 << 12
454-
TypeFlagsBooleanLiteral TypeFlags = 1 << 13
455-
TypeFlagsUniqueESSymbol TypeFlags = 1 << 14 // unique symbol
456-
TypeFlagsEnumLiteral TypeFlags = 1 << 15 // Always combined with StringLiteral, NumberLiteral, or Union
457-
TypeFlagsEnum TypeFlags = 1 << 16 // Numeric computed enum member value (must be right after EnumLiteral, see getSortOrderFlags)
458-
TypeFlagsNonPrimitive TypeFlags = 1 << 17 // intrinsic object type
459-
TypeFlagsNever TypeFlags = 1 << 18 // Never type
460-
TypeFlagsTypeParameter TypeFlags = 1 << 19 // Type parameter
461-
TypeFlagsObject TypeFlags = 1 << 20 // Object type
462-
TypeFlagsIndex TypeFlags = 1 << 21 // keyof T
463-
TypeFlagsTemplateLiteral TypeFlags = 1 << 22 // Template literal type
464-
TypeFlagsStringMapping TypeFlags = 1 << 23 // Uppercase/Lowercase type
465-
TypeFlagsSubstitution TypeFlags = 1 << 24 // Type parameter substitution
466-
TypeFlagsIndexedAccess TypeFlags = 1 << 25 // T[K]
467-
TypeFlagsConditional TypeFlags = 1 << 26 // T extends U ? X : Y
468-
TypeFlagsUnion TypeFlags = 1 << 27 // Union (T | U)
469-
TypeFlagsIntersection TypeFlags = 1 << 28 // Intersection (T & U)
470-
TypeFlagsReserved1 TypeFlags = 1 << 29 // Used by union/intersection type construction
471-
TypeFlagsReserved2 TypeFlags = 1 << 30 // Used by union/intersection type construction
472-
TypeFlagsReserved3 TypeFlags = 1 << 31
440+
TypeFlagsNone TypeFlags = 0
441+
TypeFlagsAny TypeFlags = 1 << 0
442+
TypeFlagsUnknown TypeFlags = 1 << 1
443+
TypeFlagsUndefined TypeFlags = 1 << 2
444+
TypeFlagsNull TypeFlags = 1 << 3
445+
TypeFlagsVoid TypeFlags = 1 << 4
446+
TypeFlagsString TypeFlags = 1 << 5
447+
TypeFlagsNumber TypeFlags = 1 << 6
448+
TypeFlagsBigInt TypeFlags = 1 << 7
449+
TypeFlagsBoolean TypeFlags = 1 << 8
450+
TypeFlagsESSymbol TypeFlags = 1 << 9 // Type of symbol primitive introduced in ES6
451+
TypeFlagsStringLiteral TypeFlags = 1 << 10
452+
TypeFlagsNumberLiteral TypeFlags = 1 << 11
453+
TypeFlagsBigIntLiteral TypeFlags = 1 << 12
454+
TypeFlagsBooleanLiteral TypeFlags = 1 << 13
455+
TypeFlagsUniqueESSymbol TypeFlags = 1 << 14 // unique symbol
456+
TypeFlagsEnumLiteral TypeFlags = 1 << 15 // Always combined with StringLiteral, NumberLiteral, or Union
457+
TypeFlagsEnum TypeFlags = 1 << 16 // Numeric computed enum member value (must be right after EnumLiteral, see getSortOrderFlags)
458+
TypeFlagsNonPrimitive TypeFlags = 1 << 17 // intrinsic object type
459+
TypeFlagsNever TypeFlags = 1 << 18 // Never type
460+
TypeFlagsTypeParameter TypeFlags = 1 << 19 // Type parameter
461+
TypeFlagsObject TypeFlags = 1 << 20 // Object type
462+
TypeFlagsIndex TypeFlags = 1 << 21 // keyof T
463+
TypeFlagsTemplateLiteral TypeFlags = 1 << 22 // Template literal type
464+
TypeFlagsStringMapping TypeFlags = 1 << 23 // Uppercase/Lowercase type
465+
TypeFlagsSubstitution TypeFlags = 1 << 24 // Type parameter substitution
466+
TypeFlagsIndexedAccess TypeFlags = 1 << 25 // T[K]
467+
TypeFlagsConditional TypeFlags = 1 << 26 // T extends U ? X : Y
468+
TypeFlagsUnion TypeFlags = 1 << 27 // Union (T | U)
469+
TypeFlagsIntersection TypeFlags = 1 << 28 // Intersection (T & U)
470+
TypeFlagsReserved1 TypeFlags = 1 << 29 // Used by union/intersection type construction
471+
TypeFlagsReserved2 TypeFlags = 1 << 30 // Used by union/intersection type construction
472+
TypeFlagsRegisteredESSymbol TypeFlags = 1 << 31 // RegisteredSymbol<K> with an unresolved key
473473

474474
TypeFlagsAnyOrUnknown = TypeFlagsAny | TypeFlagsUnknown
475475
TypeFlagsNullable = TypeFlagsUndefined | TypeFlagsNull
@@ -486,7 +486,7 @@ const (
486486
TypeFlagsBigIntLike = TypeFlagsBigInt | TypeFlagsBigIntLiteral
487487
TypeFlagsBooleanLike = TypeFlagsBoolean | TypeFlagsBooleanLiteral
488488
TypeFlagsEnumLike = TypeFlagsEnum | TypeFlagsEnumLiteral
489-
TypeFlagsESSymbolLike = TypeFlagsESSymbol | TypeFlagsUniqueESSymbol
489+
TypeFlagsESSymbolLike = TypeFlagsESSymbol | TypeFlagsUniqueESSymbol | TypeFlagsRegisteredESSymbol
490490
TypeFlagsVoidLike = TypeFlagsVoid | TypeFlagsUndefined
491491
TypeFlagsPrimitive = TypeFlagsStringLike | TypeFlagsNumberLike | TypeFlagsBigIntLike | TypeFlagsBooleanLike | TypeFlagsEnumLike | TypeFlagsESSymbolLike | TypeFlagsVoidLike | TypeFlagsNull
492492
TypeFlagsDefinitelyNonNullable = TypeFlagsStringLike | TypeFlagsNumberLike | TypeFlagsBigIntLike | TypeFlagsBooleanLike | TypeFlagsEnumLike | TypeFlagsESSymbolLike | TypeFlagsObject | TypeFlagsNonPrimitive
@@ -495,7 +495,7 @@ const (
495495
TypeFlagsStructuredType = TypeFlagsObject | TypeFlagsUnion | TypeFlagsIntersection
496496
TypeFlagsTypeVariable = TypeFlagsTypeParameter | TypeFlagsIndexedAccess
497497
TypeFlagsInstantiableNonPrimitive = TypeFlagsTypeVariable | TypeFlagsConditional | TypeFlagsSubstitution
498-
TypeFlagsInstantiablePrimitive = TypeFlagsIndex | TypeFlagsTemplateLiteral | TypeFlagsStringMapping
498+
TypeFlagsInstantiablePrimitive = TypeFlagsIndex | TypeFlagsTemplateLiteral | TypeFlagsStringMapping | TypeFlagsRegisteredESSymbol
499499
TypeFlagsInstantiable = TypeFlagsInstantiableNonPrimitive | TypeFlagsInstantiablePrimitive
500500
TypeFlagsStructuredOrInstantiable = TypeFlagsStructuredType | TypeFlagsInstantiable
501501
TypeFlagsObjectFlagsType = TypeFlagsAny | TypeFlagsNullable | TypeFlagsNever | TypeFlagsObject | TypeFlagsUnion | TypeFlagsIntersection
@@ -505,7 +505,7 @@ const (
505505
// This *should* be every type other than null, undefined, void, and never
506506
TypeFlagsNarrowable = TypeFlagsAny | TypeFlagsUnknown | TypeFlagsStructuredOrInstantiable | TypeFlagsStringLike | TypeFlagsNumberLike | TypeFlagsBigIntLike | TypeFlagsBooleanLike | TypeFlagsESSymbol | TypeFlagsUniqueESSymbol | TypeFlagsNonPrimitive
507507
// The following flags are aggregated during union and intersection type construction
508-
TypeFlagsIncludesMask = TypeFlagsAny | TypeFlagsUnknown | TypeFlagsPrimitive | TypeFlagsNever | TypeFlagsObject | TypeFlagsUnion | TypeFlagsIntersection | TypeFlagsNonPrimitive | TypeFlagsTemplateLiteral | TypeFlagsStringMapping
508+
TypeFlagsIncludesMask = TypeFlagsAny | TypeFlagsUnknown | TypeFlagsPrimitive | TypeFlagsNever | TypeFlagsObject | TypeFlagsUnion | TypeFlagsIntersection | TypeFlagsNonPrimitive | TypeFlagsTemplateLiteral | TypeFlagsStringMapping | TypeFlagsRegisteredESSymbol
509509
// The following flags are used for different purposes during union and intersection type construction
510510
TypeFlagsIncludesMissingType = TypeFlagsTypeParameter
511511
TypeFlagsIncludesNonWideningType = TypeFlagsIndex
@@ -545,6 +545,7 @@ var typeFlagNames = [...]struct {
545545
{TypeFlagsIndex, "Index"},
546546
{TypeFlagsTemplateLiteral, "TemplateLiteral"},
547547
{TypeFlagsStringMapping, "StringMapping"},
548+
{TypeFlagsRegisteredESSymbol, "RegisteredESSymbol"},
548549
{TypeFlagsSubstitution, "Substitution"},
549550
{TypeFlagsIndexedAccess, "IndexedAccess"},
550551
{TypeFlagsConditional, "Conditional"},
@@ -724,8 +725,11 @@ func (t *Type) AsIndexType() *IndexType { return t.data.(*In
724725
func (t *Type) AsIndexedAccessType() *IndexedAccessType { return t.data.(*IndexedAccessType) }
725726
func (t *Type) AsTemplateLiteralType() *TemplateLiteralType { return t.data.(*TemplateLiteralType) }
726727
func (t *Type) AsStringMappingType() *StringMappingType { return t.data.(*StringMappingType) }
727-
func (t *Type) AsSubstitutionType() *SubstitutionType { return t.data.(*SubstitutionType) }
728-
func (t *Type) AsConditionalType() *ConditionalType { return t.data.(*ConditionalType) }
728+
func (t *Type) AsRegisteredESSymbolType() *RegisteredESSymbolType {
729+
return t.data.(*RegisteredESSymbolType)
730+
}
731+
func (t *Type) AsSubstitutionType() *SubstitutionType { return t.data.(*SubstitutionType) }
732+
func (t *Type) AsConditionalType() *ConditionalType { return t.data.(*ConditionalType) }
729733

730734
// Casts for embedded struct types
731735

@@ -760,6 +764,8 @@ func (t *Type) Target() *Type {
760764
return t.AsIndexType().target
761765
case t.flags&TypeFlagsStringMapping != 0:
762766
return t.AsStringMappingType().target
767+
case t.flags&TypeFlagsRegisteredESSymbol != 0:
768+
return t.AsRegisteredESSymbolType().target
763769
case t.flags&TypeFlagsObject != 0 && t.objectFlags&ObjectFlagsMapped != 0:
764770
return t.AsMappedType().target
765771
}
@@ -1247,6 +1253,11 @@ type StringMappingType struct {
12471253

12481254
func (t *StringMappingType) Target() *Type { return t.target }
12491255

1256+
type RegisteredESSymbolType struct {
1257+
ConstrainedType
1258+
target *Type
1259+
}
1260+
12501261
type SubstitutionType struct {
12511262
ConstrainedType
12521263
baseType *Type // Target type

‎tsc/internal/checker/utilities.go‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,10 @@ func CompareTypes(t1, t2 *Type) int {
616616
if c := CompareTypes(t1.AsStringMappingType().target, t2.AsStringMappingType().target); c != 0 {
617617
return c
618618
}
619+
case t1.flags&TypeFlagsRegisteredESSymbol != 0:
620+
if c := CompareTypes(t1.AsRegisteredESSymbolType().target, t2.AsRegisteredESSymbolType().target); c != 0 {
621+
return c
622+
}
619623
}
620624
// Fall back to type IDs. This results in type creation order for built-in types.
621625
return int(t1.id) - int(t2.id)

0 commit comments

Comments
 (0)