Skip to content

Commit 1b7faf1

Browse files
authored
Merge pull request #17254 from Microsoft/generic-Object-jsdoc-creates-index-signature
JSDoc:Object<string, T> creates index signature
2 parents 8a1cd33 + 047ab9b commit 1b7faf1

File tree

4 files changed

+49
-4
lines changed

4 files changed

+49
-4
lines changed

src/compiler/checker.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6870,8 +6870,19 @@ namespace ts {
68706870
return node.flags & NodeFlags.JSDoc && node.kind === SyntaxKind.TypeReference;
68716871
}
68726872

6873-
function getPrimitiveTypeFromJSDocTypeReference(node: TypeReferenceNode): Type {
6873+
function getIntendedTypeFromJSDocTypeReference(node: TypeReferenceNode): Type {
68746874
if (isIdentifier(node.typeName)) {
6875+
if (node.typeName.text === "Object") {
6876+
if (node.typeArguments && node.typeArguments.length === 2) {
6877+
const indexed = getTypeFromTypeNode(node.typeArguments[0]);
6878+
const target = getTypeFromTypeNode(node.typeArguments[1]);
6879+
const index = createIndexInfo(target, /*isReadonly*/ false);
6880+
if (indexed === stringType || indexed === numberType) {
6881+
return createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, indexed === stringType && index, indexed === numberType && index);
6882+
}
6883+
}
6884+
return anyType;
6885+
}
68756886
switch (node.typeName.text) {
68766887
case "String":
68776888
return stringType;
@@ -6885,8 +6896,6 @@ namespace ts {
68856896
return undefinedType;
68866897
case "Null":
68876898
return nullType;
6888-
case "Object":
6889-
return anyType;
68906899
case "Function":
68916900
case "function":
68926901
return globalFunctionType;
@@ -6912,7 +6921,7 @@ namespace ts {
69126921
let type: Type;
69136922
let meaning = SymbolFlags.Type;
69146923
if (isJSDocTypeReference(node)) {
6915-
type = getPrimitiveTypeFromJSDocTypeReference(node);
6924+
type = getIntendedTypeFromJSDocTypeReference(node);
69166925
meaning |= SymbolFlags.Value;
69176926
}
69186927
if (!type) {
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
=== tests/cases/conformance/jsdoc/indices.js ===
2+
/** @type {Object.<string, number>} */
3+
var o1;
4+
>o1 : Symbol(o1, Decl(indices.js, 1, 3))
5+
6+
/** @type {Object.<number, boolean>} */
7+
var o2;
8+
>o2 : Symbol(o2, Decl(indices.js, 3, 3))
9+
10+
/** @type {Object.<boolean, string>} */
11+
var o3;
12+
>o3 : Symbol(o3, Decl(indices.js, 5, 3))
13+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
=== tests/cases/conformance/jsdoc/indices.js ===
2+
/** @type {Object.<string, number>} */
3+
var o1;
4+
>o1 : { [x: string]: number; }
5+
6+
/** @type {Object.<number, boolean>} */
7+
var o2;
8+
>o2 : { [x: number]: boolean; }
9+
10+
/** @type {Object.<boolean, string>} */
11+
var o3;
12+
>o3 : any
13+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// @allowJs: true
2+
// @checkJs: true
3+
// @noEmit: true
4+
// @Filename: indices.js
5+
/** @type {Object.<string, number>} */
6+
var o1;
7+
/** @type {Object.<number, boolean>} */
8+
var o2;
9+
/** @type {Object.<boolean, string>} */
10+
var o3;

0 commit comments

Comments
 (0)