@@ -6382,15 +6382,14 @@ namespace ts {
6382
6382
return type.resolvedBaseTypes = emptyArray;
6383
6383
}
6384
6384
const baseTypeNode = getBaseTypeNodeOfClass(type)!;
6385
- const typeArgs = typeArgumentsFromTypeReferenceNode(baseTypeNode);
6386
6385
let baseType: Type;
6387
6386
const originalBaseType = baseConstructorType.symbol ? getDeclaredTypeOfSymbol(baseConstructorType.symbol) : undefined;
6388
6387
if (baseConstructorType.symbol && baseConstructorType.symbol.flags & SymbolFlags.Class &&
6389
6388
areAllOuterTypeParametersApplied(originalBaseType!)) {
6390
6389
// When base constructor type is a class with no captured type arguments we know that the constructors all have the same type parameters as the
6391
6390
// class and all return the instance type of the class. There is no need for further checks and we can apply the
6392
6391
// type arguments in the same manner as a type reference to get the same error reporting experience.
6393
- baseType = getTypeFromClassOrInterfaceReference(baseTypeNode, baseConstructorType.symbol, typeArgs );
6392
+ baseType = getTypeFromClassOrInterfaceReference(baseTypeNode, baseConstructorType.symbol);
6394
6393
}
6395
6394
else if (baseConstructorType.flags & TypeFlags.Any) {
6396
6395
baseType = baseConstructorType;
@@ -9115,7 +9114,7 @@ namespace ts {
9115
9114
return type;
9116
9115
}
9117
9116
9118
- function createDeferredTypeReference(target: GenericType, node: ArrayTypeNode | TupleTypeNode, mapper?: TypeMapper): DeferredTypeReference {
9117
+ function createDeferredTypeReference(target: GenericType, node: TypeReferenceNode | ArrayTypeNode | TupleTypeNode, mapper?: TypeMapper): DeferredTypeReference {
9119
9118
const aliasSymbol = getAliasSymbolForTypeNode(node);
9120
9119
const aliasTypeArguments = getTypeArgumentsForAliasSymbol(aliasSymbol);
9121
9120
const type = <DeferredTypeReference>createObjectType(ObjectFlags.Reference, target.symbol);
@@ -9129,7 +9128,11 @@ namespace ts {
9129
9128
9130
9129
function getTypeArguments(type: TypeReference): ReadonlyArray<Type> {
9131
9130
if (!type.resolvedTypeArguments) {
9132
- const typeArguments = type.node ? map(type.node.kind === SyntaxKind.ArrayType ? [type.node.elementType] : type.node.elementTypes, getTypeFromTypeNode) : emptyArray;
9131
+ const node = type.node;
9132
+ const typeArguments = !node ? emptyArray :
9133
+ node.kind === SyntaxKind.TypeReference ? concatenate(type.target.outerTypeParameters, getEffectiveTypeArguments(node, type.target.localTypeParameters!)) :
9134
+ node.kind === SyntaxKind.ArrayType ? [getTypeFromTypeNode(node.elementType)] :
9135
+ map(node.elementTypes, getTypeFromTypeNode);
9133
9136
type.resolvedTypeArguments = type.mapper ? instantiateTypes(typeArguments, type.mapper) : typeArguments;
9134
9137
}
9135
9138
return type.resolvedTypeArguments;
@@ -9139,10 +9142,11 @@ namespace ts {
9139
9142
return length(type.target.typeParameters);
9140
9143
}
9141
9144
9145
+
9142
9146
/**
9143
9147
* Get type from type-reference that reference to class or interface
9144
9148
*/
9145
- function getTypeFromClassOrInterfaceReference(node: NodeWithTypeArguments, symbol: Symbol, typeArgs: Type[] | undefined ): Type {
9149
+ function getTypeFromClassOrInterfaceReference(node: NodeWithTypeArguments, symbol: Symbol): Type {
9146
9150
const type = <InterfaceType>getDeclaredTypeOfSymbol(getMergedSymbol(symbol));
9147
9151
const typeParameters = type.localTypeParameters;
9148
9152
if (typeParameters) {
@@ -9166,10 +9170,13 @@ namespace ts {
9166
9170
return errorType;
9167
9171
}
9168
9172
}
9173
+ if (node.kind === SyntaxKind.TypeReference && isAliasedType(node)) {
9174
+ return createDeferredTypeReference(<GenericType>type, <TypeReferenceNode>node, /*mapper*/ undefined);
9175
+ }
9169
9176
// In a type reference, the outer type parameters of the referenced class or interface are automatically
9170
9177
// supplied as type arguments and the type reference only specifies arguments for the local type parameters
9171
9178
// of the class or interface.
9172
- const typeArguments = concatenate(type.outerTypeParameters, fillMissingTypeArguments(typeArgs , typeParameters, minTypeArgumentCount, isJs));
9179
+ const typeArguments = concatenate(type.outerTypeParameters, fillMissingTypeArguments(typeArgumentsFromTypeReferenceNode(node) , typeParameters, minTypeArgumentCount, isJs));
9173
9180
return createTypeReference(<GenericType>type, typeArguments);
9174
9181
}
9175
9182
return checkNoTypeArguments(node, symbol) ? type : errorType;
@@ -9192,7 +9199,7 @@ namespace ts {
9192
9199
* references to the type parameters of the alias. We replace those with the actual type arguments by instantiating the
9193
9200
* declared type. Instantiations are cached using the type identities of the type arguments as the key.
9194
9201
*/
9195
- function getTypeFromTypeAliasReference(node: NodeWithTypeArguments, symbol: Symbol, typeArguments: Type[] | undefined ): Type {
9202
+ function getTypeFromTypeAliasReference(node: NodeWithTypeArguments, symbol: Symbol): Type {
9196
9203
const type = getDeclaredTypeOfSymbol(symbol);
9197
9204
const typeParameters = getSymbolLinks(symbol).typeParameters;
9198
9205
if (typeParameters) {
@@ -9208,7 +9215,7 @@ namespace ts {
9208
9215
typeParameters.length);
9209
9216
return errorType;
9210
9217
}
9211
- return getTypeAliasInstantiation(symbol, typeArguments );
9218
+ return getTypeAliasInstantiation(symbol, typeArgumentsFromTypeReferenceNode(node) );
9212
9219
}
9213
9220
return checkNoTypeArguments(node, symbol) ? type : errorType;
9214
9221
}
@@ -9239,27 +9246,23 @@ namespace ts {
9239
9246
}
9240
9247
9241
9248
function getTypeReferenceType(node: NodeWithTypeArguments, symbol: Symbol): Type {
9242
- const typeArguments = typeArgumentsFromTypeReferenceNode(node); // Do unconditionally so we mark type arguments as referenced.
9243
9249
if (symbol === unknownSymbol) {
9244
9250
return errorType;
9245
9251
}
9246
9252
symbol = getExpandoSymbol(symbol) || symbol;
9247
-
9248
9253
if (symbol.flags & (SymbolFlags.Class | SymbolFlags.Interface)) {
9249
- return getTypeFromClassOrInterfaceReference(node, symbol, typeArguments );
9254
+ return getTypeFromClassOrInterfaceReference(node, symbol);
9250
9255
}
9251
9256
if (symbol.flags & SymbolFlags.TypeAlias) {
9252
- return getTypeFromTypeAliasReference(node, symbol, typeArguments );
9257
+ return getTypeFromTypeAliasReference(node, symbol);
9253
9258
}
9254
-
9255
9259
// Get type from reference to named type that cannot be generic (enum or type parameter)
9256
9260
const res = tryGetDeclaredTypeOfSymbol(symbol);
9257
9261
if (res) {
9258
9262
return checkNoTypeArguments(node, symbol) ?
9259
9263
res.flags & TypeFlags.TypeParameter ? getConstrainedTypeVariable(<TypeParameter>res, node) : getRegularTypeOfLiteralType(res) :
9260
9264
errorType;
9261
9265
}
9262
-
9263
9266
if (symbol.flags & SymbolFlags.Value && isJSDocTypeReference(node)) {
9264
9267
const jsdocType = getTypeFromJSAlias(node, symbol);
9265
9268
if (jsdocType) {
@@ -9271,7 +9274,6 @@ namespace ts {
9271
9274
return getTypeOfSymbol(symbol);
9272
9275
}
9273
9276
}
9274
-
9275
9277
return errorType;
9276
9278
}
9277
9279
@@ -26100,16 +26102,13 @@ namespace ts {
26100
26102
if (node.kind === SyntaxKind.TypeReference && node.typeName.jsdocDotPos !== undefined && !isInJSFile(node) && !isInJSDoc(node)) {
26101
26103
grammarErrorAtPos(node, node.typeName.jsdocDotPos, 1, Diagnostics.JSDoc_types_can_only_be_used_inside_documentation_comments);
26102
26104
}
26105
+ forEach(node.typeArguments, checkSourceElement);
26103
26106
const type = getTypeFromTypeReference(node);
26104
26107
if (type !== errorType) {
26105
- if (node.typeArguments) {
26106
- // Do type argument local checks only if referenced type is successfully resolved
26107
- forEach(node.typeArguments, checkSourceElement);
26108
- if (produceDiagnostics) {
26109
- const typeParameters = getTypeParametersForTypeReference(node);
26110
- if (typeParameters) {
26111
- checkTypeArgumentConstraints(node, typeParameters);
26112
- }
26108
+ if (node.typeArguments && produceDiagnostics) {
26109
+ const typeParameters = getTypeParametersForTypeReference(node);
26110
+ if (typeParameters) {
26111
+ checkTypeArgumentConstraints(node, typeParameters);
26113
26112
}
26114
26113
}
26115
26114
if (type.flags & TypeFlags.Enum && getNodeLinks(node).resolvedSymbol!.flags & SymbolFlags.EnumMember) {
@@ -29333,6 +29332,7 @@ namespace ts {
29333
29332
29334
29333
const baseTypeNode = getEffectiveBaseTypeNode(node);
29335
29334
if (baseTypeNode) {
29335
+ forEach(baseTypeNode.typeArguments, checkSourceElement);
29336
29336
if (languageVersion < ScriptTarget.ES2015) {
29337
29337
checkExternalEmitHelpers(baseTypeNode.parent, ExternalEmitHelpers.Extends);
29338
29338
}
0 commit comments