diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index dafa75372e1bf..d8615c592bc0d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6870,8 +6870,19 @@ namespace ts { return node.flags & NodeFlags.JSDoc && node.kind === SyntaxKind.TypeReference; } - function getPrimitiveTypeFromJSDocTypeReference(node: TypeReferenceNode): Type { + function getIntendedTypeFromJSDocTypeReference(node: TypeReferenceNode): Type { if (isIdentifier(node.typeName)) { + if (node.typeName.text === "Object") { + if (node.typeArguments && node.typeArguments.length === 2) { + const indexed = getTypeFromTypeNode(node.typeArguments[0]); + const target = getTypeFromTypeNode(node.typeArguments[1]); + const index = createIndexInfo(target, /*isReadonly*/ false); + if (indexed === stringType || indexed === numberType) { + return createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, indexed === stringType && index, indexed === numberType && index); + } + } + return anyType; + } switch (node.typeName.text) { case "String": return stringType; @@ -6885,8 +6896,6 @@ namespace ts { return undefinedType; case "Null": return nullType; - case "Object": - return anyType; case "Function": case "function": return globalFunctionType; @@ -6912,7 +6921,7 @@ namespace ts { let type: Type; let meaning = SymbolFlags.Type; if (isJSDocTypeReference(node)) { - type = getPrimitiveTypeFromJSDocTypeReference(node); + type = getIntendedTypeFromJSDocTypeReference(node); meaning |= SymbolFlags.Value; } if (!type) { diff --git a/tests/baselines/reference/jsdocIndexSignature.symbols b/tests/baselines/reference/jsdocIndexSignature.symbols new file mode 100644 index 0000000000000..8814fc18b6f1f --- /dev/null +++ b/tests/baselines/reference/jsdocIndexSignature.symbols @@ -0,0 +1,13 @@ +=== tests/cases/conformance/jsdoc/indices.js === +/** @type {Object.} */ +var o1; +>o1 : Symbol(o1, Decl(indices.js, 1, 3)) + +/** @type {Object.} */ +var o2; +>o2 : Symbol(o2, Decl(indices.js, 3, 3)) + +/** @type {Object.} */ +var o3; +>o3 : Symbol(o3, Decl(indices.js, 5, 3)) + diff --git a/tests/baselines/reference/jsdocIndexSignature.types b/tests/baselines/reference/jsdocIndexSignature.types new file mode 100644 index 0000000000000..4c1feaa2721f1 --- /dev/null +++ b/tests/baselines/reference/jsdocIndexSignature.types @@ -0,0 +1,13 @@ +=== tests/cases/conformance/jsdoc/indices.js === +/** @type {Object.} */ +var o1; +>o1 : { [x: string]: number; } + +/** @type {Object.} */ +var o2; +>o2 : { [x: number]: boolean; } + +/** @type {Object.} */ +var o3; +>o3 : any + diff --git a/tests/cases/conformance/jsdoc/jsdocIndexSignature.ts b/tests/cases/conformance/jsdoc/jsdocIndexSignature.ts new file mode 100644 index 0000000000000..fdf9e06e61eb0 --- /dev/null +++ b/tests/cases/conformance/jsdoc/jsdocIndexSignature.ts @@ -0,0 +1,10 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true +// @Filename: indices.js +/** @type {Object.} */ +var o1; +/** @type {Object.} */ +var o2; +/** @type {Object.} */ +var o3;