Skip to content

Commit 57e652d

Browse files
authored
Js/check type tags (microsoft#24967)
* Check the type expression of `@type` tags * Update existing tests and baselines
1 parent 34b9c4d commit 57e652d

10 files changed

+96
-9
lines changed

src/compiler/checker.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22601,6 +22601,10 @@ namespace ts {
2260122601
checkSourceElement(node.typeExpression);
2260222602
}
2260322603

22604+
function checkJSDocTypeTag(node: JSDocTypeTag) {
22605+
checkSourceElement(node.typeExpression);
22606+
}
22607+
2260422608
function checkJSDocParameterTag(node: JSDocParameterTag) {
2260522609
checkSourceElement(node.typeExpression);
2260622610
if (!getParameterSymbolFromJSDoc(node)) {
@@ -25562,6 +25566,8 @@ namespace ts {
2556225566
case SyntaxKind.JSDocTypedefTag:
2556325567
case SyntaxKind.JSDocCallbackTag:
2556425568
return checkJSDocTypeAliasTag(node as JSDocTypedefTag);
25569+
case SyntaxKind.JSDocTypeTag:
25570+
return checkJSDocTypeTag(node as JSDocTypeTag);
2556525571
case SyntaxKind.JSDocParameterTag:
2556625572
return checkJSDocParameterTag(node as JSDocParameterTag);
2556725573
case SyntaxKind.JSDocFunctionType:
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
tests/cases/conformance/jsdoc/test.js(5,14): error TS2344: Type 'number' does not satisfy the constraint 'string'.
2+
tests/cases/conformance/jsdoc/test.js(7,14): error TS2344: Type 'number' does not satisfy the constraint 'string'.
3+
4+
5+
==== tests/cases/conformance/jsdoc/t.d.ts (0 errors) ====
6+
type A<T extends string> = { a: T }
7+
8+
==== tests/cases/conformance/jsdoc/test.js (2 errors) ====
9+
/** Also should error for jsdoc typedefs
10+
* @template {string} U
11+
* @typedef {{ b: U }} B
12+
*/
13+
/** @type {A<number>} */
14+
~~~~~~
15+
!!! error TS2344: Type 'number' does not satisfy the constraint 'string'.
16+
var a;
17+
/** @type {B<number>} */
18+
~~~~~~
19+
!!! error TS2344: Type 'number' does not satisfy the constraint 'string'.
20+
var b;
21+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
=== tests/cases/conformance/jsdoc/t.d.ts ===
2+
type A<T extends string> = { a: T }
3+
>A : Symbol(A, Decl(t.d.ts, 0, 0))
4+
>T : Symbol(T, Decl(t.d.ts, 0, 7))
5+
>a : Symbol(a, Decl(t.d.ts, 0, 28))
6+
>T : Symbol(T, Decl(t.d.ts, 0, 7))
7+
8+
=== tests/cases/conformance/jsdoc/test.js ===
9+
/** Also should error for jsdoc typedefs
10+
* @template {string} U
11+
* @typedef {{ b: U }} B
12+
*/
13+
/** @type {A<number>} */
14+
var a;
15+
>a : Symbol(a, Decl(test.js, 5, 3))
16+
17+
/** @type {B<number>} */
18+
var b;
19+
>b : Symbol(b, Decl(test.js, 7, 3))
20+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
=== tests/cases/conformance/jsdoc/t.d.ts ===
2+
type A<T extends string> = { a: T }
3+
>A : A<T>
4+
>T : T
5+
>a : T
6+
>T : T
7+
8+
=== tests/cases/conformance/jsdoc/test.js ===
9+
/** Also should error for jsdoc typedefs
10+
* @template {string} U
11+
* @typedef {{ b: U }} B
12+
*/
13+
/** @type {A<number>} */
14+
var a;
15+
>a : A<number>
16+
17+
/** @type {B<number>} */
18+
var b;
19+
>b : { b: number; }
20+
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
tests/cases/compiler/example.js(3,20): error TS1110: Type expected.
2+
tests/cases/compiler/example.js(3,21): error TS2304: Cannot find name 'foo'.
23

34

4-
==== tests/cases/compiler/example.js (1 errors) ====
5+
==== tests/cases/compiler/example.js (2 errors) ====
56
// @ts-check
67
/**
78
* @type {function(@foo)}
89
~
910
!!! error TS1110: Type expected.
11+
~~~
12+
!!! error TS2304: Cannot find name 'foo'.
1013
*/
1114
let x;

tests/baselines/reference/typedefMultipleTypeParameters.errors.txt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
tests/cases/conformance/jsdoc/a.js(16,12): error TS2314: Generic type 'Everything' requires 5 type argument(s).
1+
tests/cases/conformance/jsdoc/a.js(12,23): error TS2344: Type '{ a: number; }' does not satisfy the constraint '{ a: number; b: string; }'.
2+
Property 'b' is missing in type '{ a: number; }'.
3+
tests/cases/conformance/jsdoc/a.js(15,12): error TS2314: Generic type 'Everything' requires 5 type argument(s).
24
tests/cases/conformance/jsdoc/test.ts(1,34): error TS2344: Type '{ a: number; }' does not satisfy the constraint '{ a: number; b: string; }'.
35
Property 'b' is missing in type '{ a: number; }'.
46

57

6-
==== tests/cases/conformance/jsdoc/a.js (1 errors) ====
8+
==== tests/cases/conformance/jsdoc/a.js (2 errors) ====
79
/**
810
* @template {{ a: number, b: string }} T,U A Comment
911
* @template {{ c: boolean }} V uh ... are comments even supported??
@@ -15,8 +17,10 @@ tests/cases/conformance/jsdoc/test.ts(1,34): error TS2344: Type '{ a: number; }'
1517
/** @type {Everything<{ a: number, b: 'hi', c: never }, undefined, { c: true, d: 1 }, number, string>} */
1618
var tuvwx;
1719

18-
// TODO: will error when #24592 is fixed
1920
/** @type {Everything<{ a: number }, undefined, { c: 1, d: 1 }, number, string>} */
21+
~~~~~~~~~~~~~~
22+
!!! error TS2344: Type '{ a: number; }' does not satisfy the constraint '{ a: number; b: string; }'.
23+
!!! error TS2344: Property 'b' is missing in type '{ a: number; }'.
2024
var wrong;
2125

2226
/** @type {Everything<{ a: number }>} */

tests/baselines/reference/typedefMultipleTypeParameters.symbols

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,13 @@
1111
var tuvwx;
1212
>tuvwx : Symbol(tuvwx, Decl(a.js, 9, 3))
1313

14-
// TODO: will error when #24592 is fixed
1514
/** @type {Everything<{ a: number }, undefined, { c: 1, d: 1 }, number, string>} */
1615
var wrong;
17-
>wrong : Symbol(wrong, Decl(a.js, 13, 3))
16+
>wrong : Symbol(wrong, Decl(a.js, 12, 3))
1817

1918
/** @type {Everything<{ a: number }>} */
2019
var insufficient;
21-
>insufficient : Symbol(insufficient, Decl(a.js, 16, 3))
20+
>insufficient : Symbol(insufficient, Decl(a.js, 15, 3))
2221

2322
=== tests/cases/conformance/jsdoc/test.ts ===
2423
declare var actually: Everything<{ a: number }, undefined, { c: 1, d: 1 }, number, string>;

tests/baselines/reference/typedefMultipleTypeParameters.types

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
var tuvwx;
1212
>tuvwx : { t: { a: number; b: "hi"; c: never; }; u: undefined; v: { c: true; d: 1; }; w: number; x: string; }
1313

14-
// TODO: will error when #24592 is fixed
1514
/** @type {Everything<{ a: number }, undefined, { c: 1, d: 1 }, number, string>} */
1615
var wrong;
1716
>wrong : { t: { a: number; }; u: undefined; v: { c: 1; d: 1; }; w: number; x: string; }
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// @checkJs: true
2+
// @allowJs: true
3+
// @noEmit: true
4+
5+
// @Filename: t.d.ts
6+
type A<T extends string> = { a: T }
7+
8+
// @Filename: test.js
9+
/** Also should error for jsdoc typedefs
10+
* @template {string} U
11+
* @typedef {{ b: U }} B
12+
*/
13+
/** @type {A<number>} */
14+
var a;
15+
/** @type {B<number>} */
16+
var b;

tests/cases/conformance/jsdoc/typedefMultipleTypeParameters.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
/** @type {Everything<{ a: number, b: 'hi', c: never }, undefined, { c: true, d: 1 }, number, string>} */
1414
var tuvwx;
1515

16-
// TODO: will error when #24592 is fixed
1716
/** @type {Everything<{ a: number }, undefined, { c: 1, d: 1 }, number, string>} */
1817
var wrong;
1918

0 commit comments

Comments
 (0)