@@ -39,9 +39,19 @@ function visitArrayObjectType(type: ts.ObjectType, visitorContext: VisitorContex
39
39
return `sa_${ numberIndexName } _ea` ;
40
40
}
41
41
42
- function visitRegularObjectType ( type : ts . ObjectType ) {
43
- const id : string = ( type as unknown as { id : string } ) . id ;
44
- return `_${ id } ` ;
42
+ function getTypeIndexById ( type : ts . Type , { typeIdMap } : VisitorContext ) {
43
+ const id = ( type as unknown as { id : string | number } ) . id . toString ( ) ;
44
+ let index = typeIdMap . get ( id ) ;
45
+ if ( index === undefined ) {
46
+ index = typeIdMap . size . toString ( ) ;
47
+ typeIdMap . set ( id , index ) ;
48
+ }
49
+ return index ;
50
+ }
51
+
52
+ function visitRegularObjectType ( type : ts . Type , visitorContext : VisitorContext ) {
53
+ const index = getTypeIndexById ( type , visitorContext ) ;
54
+ return `_${ index } ` ;
45
55
}
46
56
47
57
function visitTypeReference ( type : ts . TypeReference , visitorContext : VisitorContext , mode : NameMode ) {
@@ -71,7 +81,7 @@ function visitObjectType(type: ts.ObjectType, visitorContext: VisitorContext, mo
71
81
} else if ( checkIsDateClass ( type ) ) {
72
82
return '_date' ;
73
83
} else {
74
- return visitRegularObjectType ( type ) ;
84
+ return visitRegularObjectType ( type , visitorContext ) ;
75
85
}
76
86
}
77
87
@@ -98,7 +108,7 @@ function visitIndexedAccessType(type: ts.IndexedAccessType, visitorContext: Visi
98
108
99
109
export function visitType ( type : ts . Type , visitorContext : VisitorContext , mode : NameMode ) : string {
100
110
let name : string ;
101
- const id : string = ( type as unknown as { id : string } ) . id ;
111
+ const index = getTypeIndexById ( type , visitorContext ) ;
102
112
if ( ( ts . TypeFlags . Any & type . flags ) !== 0 ) {
103
113
name = VisitorUtils . getAnyFunction ( visitorContext ) ;
104
114
} else if ( ( ts . TypeFlags . Unknown & type . flags ) !== 0 ) {
@@ -118,25 +128,25 @@ export function visitType(type: ts.Type, visitorContext: VisitorContext, mode: N
118
128
} else if ( ( ts . TypeFlags . String & type . flags ) !== 0 ) {
119
129
name = VisitorUtils . getStringFunction ( visitorContext ) ;
120
130
} else if ( ( ts . TypeFlags . BooleanLiteral & type . flags ) !== 0 ) {
121
- name = `_${ id } ` ;
131
+ name = `_${ index } ` ;
122
132
} else if ( tsutils . isTypeReference ( type ) && visitorContext . previousTypeReference !== type ) {
123
133
name = visitTypeReference ( type , visitorContext , mode ) ;
124
134
} else if ( ( ts . TypeFlags . TypeParameter & type . flags ) !== 0 ) {
125
135
name = visitTypeParameter ( type , visitorContext , mode ) ;
126
136
} else if ( tsutils . isObjectType ( type ) ) {
127
137
name = visitObjectType ( type , visitorContext , mode ) ;
128
138
} else if ( tsutils . isLiteralType ( type ) ) {
129
- name = `_${ id } ` ;
139
+ name = `_${ index } ` ;
130
140
} else if ( tsutils . isUnionOrIntersectionType ( type ) ) {
131
141
name = visitUnionOrIntersectionType ( type , visitorContext , mode ) ;
132
142
} else if ( ( ts . TypeFlags . NonPrimitive & type . flags ) !== 0 ) {
133
- name = `_${ id } ` ;
143
+ name = `_${ index } ` ;
134
144
} else if ( ( ts . TypeFlags . Index & type . flags ) !== 0 ) {
135
145
name = visitIndexType ( type , visitorContext ) ;
136
146
} else if ( tsutils . isIndexedAccessType ( type ) ) {
137
147
name = visitIndexedAccessType ( type , visitorContext ) ;
138
148
} else if ( ( ts . TypeFlags . TemplateLiteral & type . flags ) !== 0 ) {
139
- name = `_${ id } ` ;
149
+ name = `_${ index } ` ;
140
150
} else {
141
151
throw new Error ( 'Could not generate type-check; unsupported type with flags: ' + type . flags ) ;
142
152
}
@@ -153,7 +163,8 @@ export function visitType(type: ts.Type, visitorContext: VisitorContext, mode: N
153
163
if ( tsutils . isTypeReference ( type ) && type . typeArguments !== undefined ) {
154
164
for ( const typeArgument of type . typeArguments ) {
155
165
const resolvedType = VisitorUtils . getResolvedTypeParameter ( typeArgument , visitorContext ) || typeArgument ;
156
- name += `_${ ( resolvedType as unknown as { id : string } ) . id } ` ;
166
+ const resolvedTypeIndex = getTypeIndexById ( resolvedType , visitorContext ) ;
167
+ name += `_${ resolvedTypeIndex } ` ;
157
168
}
158
169
}
159
170
return name ;
0 commit comments