@@ -7030,13 +7030,11 @@ namespace ts {
70307030 function getIntendedTypeFromJSDocTypeReference(node: TypeReferenceNode): Type {
70317031 if (isIdentifier(node.typeName)) {
70327032 if (node.typeName.escapedText === "Object") {
7033- if (node.typeArguments && node.typeArguments.length === 2 ) {
7033+ if (isJSDocIndexSignature( node) ) {
70347034 const indexed = getTypeFromTypeNode(node.typeArguments[0]);
70357035 const target = getTypeFromTypeNode(node.typeArguments[1]);
70367036 const index = createIndexInfo(target, /*isReadonly*/ false);
7037- if (indexed === stringType || indexed === numberType) {
7038- return createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, indexed === stringType && index, indexed === numberType && index);
7039- }
7037+ return createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, indexed === stringType && index, indexed === numberType && index);
70407038 }
70417039 return anyType;
70427040 }
@@ -7066,6 +7064,14 @@ namespace ts {
70667064 }
70677065 }
70687066
7067+ function isJSDocIndexSignature(node: TypeReferenceNode | ExpressionWithTypeArguments) {
7068+ return isTypeReferenceNode(node) &&
7069+ isIdentifier(node.typeName) &&
7070+ node.typeName.escapedText === "Object" &&
7071+ node.typeArguments && node.typeArguments.length === 2 &&
7072+ (node.typeArguments[0].kind === SyntaxKind.StringKeyword || node.typeArguments[0].kind === SyntaxKind.NumberKeyword);
7073+ }
7074+
70697075 function getTypeFromJSDocNullableTypeNode(node: JSDocNullableType) {
70707076 const type = getTypeFromTypeNode(node.type);
70717077 return strictNullChecks ? getUnionType([type, nullType]) : type;
@@ -19179,7 +19185,10 @@ namespace ts {
1917919185 // There is no resolved symbol cached if the type resolved to a builtin
1918019186 // via JSDoc type reference resolution (eg, Boolean became boolean), none
1918119187 // of which are generic when they have no associated symbol
19182- error(node, Diagnostics.Type_0_is_not_generic, typeToString(type));
19188+ // (additionally, JSDoc's index signature syntax, Object<string, T> actually uses generic syntax without being generic)
19189+ if (!isJSDocIndexSignature(node)) {
19190+ error(node, Diagnostics.Type_0_is_not_generic, typeToString(type));
19191+ }
1918319192 return;
1918419193 }
1918519194 let typeParameters = symbol.flags & SymbolFlags.TypeAlias && getSymbolLinks(symbol).typeParameters;
0 commit comments