@@ -14102,7 +14102,7 @@ namespace ts {
14102
14102
function instantiateType(type: Type, mapper: TypeMapper | undefined): Type;
14103
14103
function instantiateType(type: Type | undefined, mapper: TypeMapper | undefined): Type | undefined;
14104
14104
function instantiateType(type: Type | undefined, mapper: TypeMapper | undefined): Type | undefined {
14105
- if (!type || ! mapper) {
14105
+ if (!( type && mapper && couldContainTypeVariables(type)) ) {
14106
14106
return type;
14107
14107
}
14108
14108
if (instantiationDepth === 50 || instantiationCount >= 5000000) {
@@ -14138,37 +14138,23 @@ namespace ts {
14138
14138
}
14139
14139
if (flags & TypeFlags.Object) {
14140
14140
const objectFlags = (<ObjectType>type).objectFlags;
14141
- if (objectFlags & ObjectFlags.Anonymous) {
14142
- // If the anonymous type originates in a declaration of a function, method, class, or
14143
- // interface, in an object type literal, or in an object literal expression, we may need
14144
- // to instantiate the type because it might reference a type parameter.
14145
- return couldContainTypeVariables(type) ?
14146
- getObjectTypeInstantiation(<AnonymousType>type, mapper) : type;
14147
- }
14148
- if (objectFlags & ObjectFlags.Mapped) {
14149
- return getObjectTypeInstantiation(<AnonymousType>type, mapper);
14150
- }
14151
- if (objectFlags & ObjectFlags.Reference) {
14152
- if ((<TypeReference>type).node) {
14153
- return getObjectTypeInstantiation(<TypeReference>type, mapper);
14141
+ if (objectFlags & (ObjectFlags.Reference | ObjectFlags.Anonymous | ObjectFlags.Mapped)) {
14142
+ if (objectFlags & ObjectFlags.Reference && !((<TypeReference>type).node)) {
14143
+ const resolvedTypeArguments = (<TypeReference>type).resolvedTypeArguments;
14144
+ const newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper);
14145
+ return newTypeArguments !== resolvedTypeArguments ? createTypeReference((<TypeReference>type).target, newTypeArguments) : type;
14154
14146
}
14155
- const resolvedTypeArguments = (<TypeReference>type).resolvedTypeArguments;
14156
- const newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper);
14157
- return newTypeArguments !== resolvedTypeArguments ? createTypeReference((<TypeReference>type).target, newTypeArguments) : type;
14147
+ return getObjectTypeInstantiation(<TypeReference | AnonymousType | MappedType>type, mapper);
14158
14148
}
14159
14149
return type;
14160
14150
}
14161
- if ((flags & TypeFlags.Intersection) || (flags & TypeFlags.Union && !(flags & TypeFlags.Primitive))) {
14162
- if (!couldContainTypeVariables(type)) {
14163
- return type;
14164
- }
14151
+ if (flags & TypeFlags.UnionOrIntersection) {
14165
14152
const types = (<UnionOrIntersectionType>type).types;
14166
14153
const newTypes = instantiateTypes(types, mapper);
14167
- return newTypes === types
14168
- ? type
14169
- : (flags & TypeFlags.Intersection)
14170
- ? getIntersectionType(newTypes, type.aliasSymbol, instantiateTypes(type.aliasTypeArguments, mapper))
14171
- : getUnionType(newTypes, UnionReduction.Literal, type.aliasSymbol, instantiateTypes(type.aliasTypeArguments, mapper));
14154
+ return newTypes === types ? type :
14155
+ flags & TypeFlags.Intersection ?
14156
+ getIntersectionType(newTypes, type.aliasSymbol, instantiateTypes(type.aliasTypeArguments, mapper)) :
14157
+ getUnionType(newTypes, UnionReduction.Literal, type.aliasSymbol, instantiateTypes(type.aliasTypeArguments, mapper));
14172
14158
}
14173
14159
if (flags & TypeFlags.Index) {
14174
14160
return getIndexType(instantiateType((<IndexType>type).type, mapper));
0 commit comments