From 10a91c54269db9e85315dc486f178e18182c800b Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 17 Jul 2017 16:14:42 -0700 Subject: [PATCH] JSDoc:Object creates index signature And `Object` creates a numeric index signature. Other uses still create `any` as before. --- src/compiler/checker.ts | 13 +++++++++++-- .../baselines/reference/jsdocIndexSignature.symbols | 13 +++++++++++++ tests/baselines/reference/jsdocIndexSignature.types | 13 +++++++++++++ .../cases/conformance/jsdoc/jsdocIndexSignature.ts | 10 ++++++++++ 4 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/jsdocIndexSignature.symbols create mode 100644 tests/baselines/reference/jsdocIndexSignature.types create mode 100644 tests/cases/conformance/jsdoc/jsdocIndexSignature.ts 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;