Skip to content

Commit f374117

Browse files
committed
Remove erroneous error for JSDoc object literals
appears with checkJS.
1 parent e962e4a commit f374117

4 files changed

Lines changed: 64 additions & 5 deletions

File tree

src/compiler/checker.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
tests/cases/conformance/jsdoc/indices.js(9,5): error TS2322: Type '1' is not assignable to type 'boolean'.
2+
3+
4+
==== tests/cases/conformance/jsdoc/indices.js (1 errors) ====
5+
/** @type {Object.<string, number>} */
6+
var o1;
7+
/** @type {Object.<number, boolean>} */
8+
var o2;
9+
/** @type {Object.<boolean, string>} */
10+
var o3;
11+
/** @param {Object.<string, boolean>} o */
12+
function f(o) {
13+
o.foo = 1; // error
14+
~~~~~
15+
!!! error TS2322: Type '1' is not assignable to type 'boolean'.
16+
o.bar = false; // ok
17+
}
18+

tests/baselines/reference/jsdocIndexSignature.symbols

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,15 @@ var o2;
1111
var o3;
1212
>o3 : Symbol(o3, Decl(indices.js, 5, 3))
1313

14+
/** @param {Object.<string, boolean>} o */
15+
function f(o) {
16+
>f : Symbol(f, Decl(indices.js, 5, 7))
17+
>o : Symbol(o, Decl(indices.js, 7, 11))
18+
19+
o.foo = 1; // error
20+
>o : Symbol(o, Decl(indices.js, 7, 11))
21+
22+
o.bar = false; // ok
23+
>o : Symbol(o, Decl(indices.js, 7, 11))
24+
}
25+

tests/baselines/reference/jsdocIndexSignature.types

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,23 @@ var o2;
1111
var o3;
1212
>o3 : any
1313

14+
/** @param {Object.<string, boolean>} o */
15+
function f(o) {
16+
>f : (o: { [x: string]: boolean; }) => void
17+
>o : { [x: string]: boolean; }
18+
19+
o.foo = 1; // error
20+
>o.foo = 1 : 1
21+
>o.foo : boolean
22+
>o : { [x: string]: boolean; }
23+
>foo : boolean
24+
>1 : 1
25+
26+
o.bar = false; // ok
27+
>o.bar = false : false
28+
>o.bar : boolean
29+
>o : { [x: string]: boolean; }
30+
>bar : boolean
31+
>false : false
32+
}
33+

0 commit comments

Comments
 (0)