diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index dafa75372e1..8dd81d1b623 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6872,6 +6872,17 @@ namespace ts { function getPrimitiveTypeFromJSDocTypeReference(node: TypeReferenceNode): Type { if (isIdentifier(node.typeName)) { + if (node.typeName.text === "Object") { + if (node.typeArguments && node.typeArguments.length === 2) { + const from = getTypeFromTypeNode(node.typeArguments[0]); + const to = getTypeFromTypeNode(node.typeArguments[1]); + let index = createIndexInfo(to, /*isReadonly*/ false); + if (from === stringType || from === numberType) { + return createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, from === stringType ? index : undefined, from === numberType ? index : undefined) + } + } + 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; diff --git a/tests/baselines/reference/jsdocIndexSignature.symbols b/tests/baselines/reference/jsdocIndexSignature.symbols new file mode 100644 index 00000000000..8814fc18b6f --- /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 00000000000..4c1feaa2721 --- /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 00000000000..fdf9e06e61e --- /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;