@@ -3564,7 +3564,8 @@ namespace ts {
3564
3564
if (ambientModuleSymbolRegex.test(rootName)) {
3565
3565
// module is root, must use `ImportTypeNode`
3566
3566
const nonRootParts = chain.length > 1 ? createEntityNameFromSymbolChain(chain, chain.length - 1, 1) : undefined;
3567
- return createImportTypeNode(createLiteralTypeNode(createLiteral(rootName.substring(1, rootName.length - 1))), nonRootParts, isTypeOf);
3567
+ const typeParameterNodes = lookupTypeParameterNodes(chain, 0, context);
3568
+ return createImportTypeNode(createLiteralTypeNode(createLiteral(rootName.substring(1, rootName.length - 1))), nonRootParts, typeParameterNodes as ReadonlyArray<TypeNode>, isTypeOf);
3568
3569
}
3569
3570
3570
3571
const entityName = createEntityNameFromSymbolChain(chain, chain.length - 1, 0);
@@ -7234,7 +7235,7 @@ namespace ts {
7234
7235
/**
7235
7236
* Get type from type-reference that reference to class or interface
7236
7237
*/
7237
- function getTypeFromClassOrInterfaceReference(node: TypeReferenceType , symbol: Symbol, typeArgs: Type[]): Type {
7238
+ function getTypeFromClassOrInterfaceReference(node: NodeWithTypeArguments , symbol: Symbol, typeArgs: Type[]): Type {
7238
7239
const type = <InterfaceType>getDeclaredTypeOfSymbol(getMergedSymbol(symbol));
7239
7240
const typeParameters = type.localTypeParameters;
7240
7241
if (typeParameters) {
@@ -7284,7 +7285,7 @@ namespace ts {
7284
7285
* references to the type parameters of the alias. We replace those with the actual type arguments by instantiating the
7285
7286
* declared type. Instantiations are cached using the type identities of the type arguments as the key.
7286
7287
*/
7287
- function getTypeFromTypeAliasReference(node: TypeReferenceType , symbol: Symbol, typeArguments: Type[]): Type {
7288
+ function getTypeFromTypeAliasReference(node: NodeWithTypeArguments , symbol: Symbol, typeArguments: Type[]): Type {
7288
7289
const type = getDeclaredTypeOfSymbol(symbol);
7289
7290
const typeParameters = getSymbolLinks(symbol).typeParameters;
7290
7291
if (typeParameters) {
@@ -7330,7 +7331,7 @@ namespace ts {
7330
7331
return resolveEntityName(typeReferenceName, meaning) || unknownSymbol;
7331
7332
}
7332
7333
7333
- function getTypeReferenceType(node: TypeReferenceType , symbol: Symbol) {
7334
+ function getTypeReferenceType(node: NodeWithTypeArguments , symbol: Symbol) {
7334
7335
const typeArguments = typeArgumentsFromTypeReferenceNode(node); // Do unconditionally so we mark type arguments as referenced.
7335
7336
if (symbol === unknownSymbol) {
7336
7337
return unknownType;
@@ -7368,7 +7369,7 @@ namespace ts {
7368
7369
return valueType;
7369
7370
}
7370
7371
7371
- function getTypeReferenceTypeWorker(node: TypeReferenceType , symbol: Symbol, typeArguments: Type[]): Type | undefined {
7372
+ function getTypeReferenceTypeWorker(node: NodeWithTypeArguments , symbol: Symbol, typeArguments: Type[]): Type | undefined {
7372
7373
if (symbol.flags & (SymbolFlags.Class | SymbolFlags.Interface)) {
7373
7374
return getTypeFromClassOrInterfaceReference(node, symbol, typeArguments);
7374
7375
}
@@ -7416,13 +7417,13 @@ namespace ts {
7416
7417
return constraints ? getSubstitutionType(typeVariable, getIntersectionType(append(constraints, typeVariable))) : typeVariable;
7417
7418
}
7418
7419
7419
- function isJSDocTypeReference(node: TypeReferenceType ): node is TypeReferenceNode {
7420
+ function isJSDocTypeReference(node: NodeWithTypeArguments ): node is TypeReferenceNode {
7420
7421
return node.flags & NodeFlags.JSDoc && node.kind === SyntaxKind.TypeReference;
7421
7422
}
7422
7423
7423
- function checkNoTypeArguments(node: TypeReferenceType , symbol?: Symbol) {
7424
+ function checkNoTypeArguments(node: NodeWithTypeArguments , symbol?: Symbol) {
7424
7425
if (node.typeArguments) {
7425
- error(node, Diagnostics.Type_0_is_not_generic, symbol ? symbolToString(symbol) : declarationNameToString((<TypeReferenceNode>node).typeName));
7426
+ error(node, Diagnostics.Type_0_is_not_generic, symbol ? symbolToString(symbol) : (<TypeReferenceNode>node).typeName ? declarationNameToString((<TypeReferenceNode>node).typeName) : "(anonymous)" );
7426
7427
return false;
7427
7428
}
7428
7429
return true;
@@ -7503,7 +7504,7 @@ namespace ts {
7503
7504
return links.resolvedType;
7504
7505
}
7505
7506
7506
- function typeArgumentsFromTypeReferenceNode(node: TypeReferenceType ): Type[] {
7507
+ function typeArgumentsFromTypeReferenceNode(node: NodeWithTypeArguments ): Type[] {
7507
7508
return map(node.typeArguments, getTypeFromTypeNode);
7508
7509
}
7509
7510
@@ -8451,22 +8452,30 @@ namespace ts {
8451
8452
function getTypeFromImportTypeNode(node: ImportTypeNode): Type {
8452
8453
const links = getNodeLinks(node);
8453
8454
if (!links.resolvedType) {
8455
+ if (node.isTypeOf && node.typeArguments) { // Only the non-typeof form can make use of type arguments
8456
+ error(node, Diagnostics.type_arguments_can_only_be_used_in_a_ts_file);
8457
+ links.resolvedSymbol = unknownSymbol;
8458
+ return links.resolvedType = anyType;
8459
+ }
8454
8460
const argumentType = getTypeFromTypeNode(node.argument);
8455
8461
const targetMeaning = node.isTypeOf ? SymbolFlags.Value : SymbolFlags.Type;
8456
8462
// TODO: Future work: support unions/generics/whatever via a deferred import-type
8457
8463
if (!argumentType || !(argumentType.flags & TypeFlags.StringLiteral)) {
8458
8464
error(node.argument, Diagnostics.Import_specifier_must_be_a_string_literal_type_but_here_is_0, argumentType ? typeToString(argumentType) : "undefined");
8465
+ links.resolvedSymbol = unknownSymbol;
8459
8466
return links.resolvedType = anyType;
8460
8467
}
8461
8468
const moduleName = (argumentType as StringLiteralType).value;
8462
8469
const innerModuleSymbol = resolveExternalModule(node, moduleName, Diagnostics.Cannot_find_module_0, node, /*isForAugmentation*/ false);
8463
8470
if (!innerModuleSymbol) {
8464
8471
error(node, Diagnostics.Cannot_find_module_0, moduleName);
8472
+ links.resolvedSymbol = unknownSymbol;
8465
8473
return links.resolvedType = anyType;
8466
8474
}
8467
8475
const moduleSymbol = resolveExternalModuleSymbol(innerModuleSymbol, /*dontResolveAlias*/ false);
8468
8476
if (!moduleSymbol) {
8469
8477
error(node, Diagnostics.Cannot_find_module_0, moduleName);
8478
+ links.resolvedSymbol = unknownSymbol;
8470
8479
return links.resolvedType = anyType;
8471
8480
}
8472
8481
if (node.qualifier) {
@@ -8492,21 +8501,32 @@ namespace ts {
8492
8501
}
8493
8502
currentNamespace = next;
8494
8503
}
8495
- links.resolvedType = targetMeaning === SymbolFlags.Value ? getTypeOfSymbol(currentNamespace) : getDeclaredTypeOfSymbol( currentNamespace);
8504
+ resolveImportSymbolType(node, links, currentNamespace, targetMeaning );
8496
8505
}
8497
8506
else {
8498
8507
if (moduleSymbol.flags & targetMeaning) {
8499
- links.resolvedType = targetMeaning === SymbolFlags.Value ? getTypeOfSymbol(moduleSymbol) : getDeclaredTypeOfSymbol( moduleSymbol);
8508
+ resolveImportSymbolType(node, links, moduleSymbol, targetMeaning );
8500
8509
}
8501
8510
else {
8502
8511
error(node, targetMeaning === SymbolFlags.Value ? Diagnostics.Module_0_does_not_refer_to_a_value_but_is_used_as_a_value_here : Diagnostics.Module_0_does_not_refer_to_a_type_but_is_used_as_a_type_here, moduleName);
8512
+ links.resolvedSymbol = unknownSymbol;
8503
8513
links.resolvedType = anyType;
8504
8514
}
8505
8515
}
8506
8516
}
8507
8517
return links.resolvedType;
8508
8518
}
8509
8519
8520
+ function resolveImportSymbolType(node: ImportTypeNode, links: NodeLinks, symbol: Symbol, meaning: SymbolFlags) {
8521
+ links.resolvedSymbol = symbol;
8522
+ if (meaning === SymbolFlags.Value) {
8523
+ return links.resolvedType = getTypeOfSymbol(symbol);
8524
+ }
8525
+ else {
8526
+ return links.resolvedType = getTypeReferenceType(node, symbol);
8527
+ }
8528
+ }
8529
+
8510
8530
function getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node: TypeNode): Type {
8511
8531
const links = getNodeLinks(node);
8512
8532
if (!links.resolvedType) {
0 commit comments