diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c9d0a41f076..48083056ff8 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -22601,6 +22601,10 @@ namespace ts { checkSourceElement(node.typeExpression); } + function checkJSDocTypeTag(node: JSDocTypeTag) { + checkSourceElement(node.typeExpression); + } + function checkJSDocParameterTag(node: JSDocParameterTag) { checkSourceElement(node.typeExpression); if (!getParameterSymbolFromJSDoc(node)) { @@ -25562,6 +25566,8 @@ namespace ts { case SyntaxKind.JSDocTypedefTag: case SyntaxKind.JSDocCallbackTag: return checkJSDocTypeAliasTag(node as JSDocTypedefTag); + case SyntaxKind.JSDocTypeTag: + return checkJSDocTypeTag(node as JSDocTypeTag); case SyntaxKind.JSDocParameterTag: return checkJSDocParameterTag(node as JSDocParameterTag); case SyntaxKind.JSDocFunctionType: diff --git a/tests/baselines/reference/checkJsdocTypeTag4.errors.txt b/tests/baselines/reference/checkJsdocTypeTag4.errors.txt new file mode 100644 index 00000000000..4683f256093 --- /dev/null +++ b/tests/baselines/reference/checkJsdocTypeTag4.errors.txt @@ -0,0 +1,21 @@ +tests/cases/conformance/jsdoc/test.js(5,14): error TS2344: Type 'number' does not satisfy the constraint 'string'. +tests/cases/conformance/jsdoc/test.js(7,14): error TS2344: Type 'number' does not satisfy the constraint 'string'. + + +==== tests/cases/conformance/jsdoc/t.d.ts (0 errors) ==== + type A = { a: T } + +==== tests/cases/conformance/jsdoc/test.js (2 errors) ==== + /** Also should error for jsdoc typedefs + * @template {string} U + * @typedef {{ b: U }} B + */ + /** @type {A} */ + ~~~~~~ +!!! error TS2344: Type 'number' does not satisfy the constraint 'string'. + var a; + /** @type {B} */ + ~~~~~~ +!!! error TS2344: Type 'number' does not satisfy the constraint 'string'. + var b; + \ No newline at end of file diff --git a/tests/baselines/reference/checkJsdocTypeTag4.symbols b/tests/baselines/reference/checkJsdocTypeTag4.symbols new file mode 100644 index 00000000000..50e70ad3944 --- /dev/null +++ b/tests/baselines/reference/checkJsdocTypeTag4.symbols @@ -0,0 +1,20 @@ +=== tests/cases/conformance/jsdoc/t.d.ts === +type A = { a: T } +>A : Symbol(A, Decl(t.d.ts, 0, 0)) +>T : Symbol(T, Decl(t.d.ts, 0, 7)) +>a : Symbol(a, Decl(t.d.ts, 0, 28)) +>T : Symbol(T, Decl(t.d.ts, 0, 7)) + +=== tests/cases/conformance/jsdoc/test.js === +/** Also should error for jsdoc typedefs + * @template {string} U + * @typedef {{ b: U }} B + */ +/** @type {A} */ +var a; +>a : Symbol(a, Decl(test.js, 5, 3)) + +/** @type {B} */ +var b; +>b : Symbol(b, Decl(test.js, 7, 3)) + diff --git a/tests/baselines/reference/checkJsdocTypeTag4.types b/tests/baselines/reference/checkJsdocTypeTag4.types new file mode 100644 index 00000000000..04e3707a400 --- /dev/null +++ b/tests/baselines/reference/checkJsdocTypeTag4.types @@ -0,0 +1,20 @@ +=== tests/cases/conformance/jsdoc/t.d.ts === +type A = { a: T } +>A : A +>T : T +>a : T +>T : T + +=== tests/cases/conformance/jsdoc/test.js === +/** Also should error for jsdoc typedefs + * @template {string} U + * @typedef {{ b: U }} B + */ +/** @type {A} */ +var a; +>a : A + +/** @type {B} */ +var b; +>b : { b: number; } + diff --git a/tests/baselines/reference/jsdocParameterParsingInfiniteLoop.errors.txt b/tests/baselines/reference/jsdocParameterParsingInfiniteLoop.errors.txt index a43c72cf0c7..71286e23bdb 100644 --- a/tests/baselines/reference/jsdocParameterParsingInfiniteLoop.errors.txt +++ b/tests/baselines/reference/jsdocParameterParsingInfiniteLoop.errors.txt @@ -1,11 +1,14 @@ tests/cases/compiler/example.js(3,20): error TS1110: Type expected. +tests/cases/compiler/example.js(3,21): error TS2304: Cannot find name 'foo'. -==== tests/cases/compiler/example.js (1 errors) ==== +==== tests/cases/compiler/example.js (2 errors) ==== // @ts-check /** * @type {function(@foo)} ~ !!! error TS1110: Type expected. + ~~~ +!!! error TS2304: Cannot find name 'foo'. */ let x; \ No newline at end of file diff --git a/tests/baselines/reference/typedefMultipleTypeParameters.errors.txt b/tests/baselines/reference/typedefMultipleTypeParameters.errors.txt index e8d0e52ba0f..afd2e274317 100644 --- a/tests/baselines/reference/typedefMultipleTypeParameters.errors.txt +++ b/tests/baselines/reference/typedefMultipleTypeParameters.errors.txt @@ -1,9 +1,11 @@ -tests/cases/conformance/jsdoc/a.js(16,12): error TS2314: Generic type 'Everything' requires 5 type argument(s). +tests/cases/conformance/jsdoc/a.js(12,23): error TS2344: Type '{ a: number; }' does not satisfy the constraint '{ a: number; b: string; }'. + Property 'b' is missing in type '{ a: number; }'. +tests/cases/conformance/jsdoc/a.js(15,12): error TS2314: Generic type 'Everything' requires 5 type argument(s). tests/cases/conformance/jsdoc/test.ts(1,34): error TS2344: Type '{ a: number; }' does not satisfy the constraint '{ a: number; b: string; }'. Property 'b' is missing in type '{ a: number; }'. -==== tests/cases/conformance/jsdoc/a.js (1 errors) ==== +==== tests/cases/conformance/jsdoc/a.js (2 errors) ==== /** * @template {{ a: number, b: string }} T,U A Comment * @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; }' /** @type {Everything<{ a: number, b: 'hi', c: never }, undefined, { c: true, d: 1 }, number, string>} */ var tuvwx; - // TODO: will error when #24592 is fixed /** @type {Everything<{ a: number }, undefined, { c: 1, d: 1 }, number, string>} */ + ~~~~~~~~~~~~~~ +!!! error TS2344: Type '{ a: number; }' does not satisfy the constraint '{ a: number; b: string; }'. +!!! error TS2344: Property 'b' is missing in type '{ a: number; }'. var wrong; /** @type {Everything<{ a: number }>} */ diff --git a/tests/baselines/reference/typedefMultipleTypeParameters.symbols b/tests/baselines/reference/typedefMultipleTypeParameters.symbols index 9acd30fea1b..f961ea79698 100644 --- a/tests/baselines/reference/typedefMultipleTypeParameters.symbols +++ b/tests/baselines/reference/typedefMultipleTypeParameters.symbols @@ -11,14 +11,13 @@ var tuvwx; >tuvwx : Symbol(tuvwx, Decl(a.js, 9, 3)) -// TODO: will error when #24592 is fixed /** @type {Everything<{ a: number }, undefined, { c: 1, d: 1 }, number, string>} */ var wrong; ->wrong : Symbol(wrong, Decl(a.js, 13, 3)) +>wrong : Symbol(wrong, Decl(a.js, 12, 3)) /** @type {Everything<{ a: number }>} */ var insufficient; ->insufficient : Symbol(insufficient, Decl(a.js, 16, 3)) +>insufficient : Symbol(insufficient, Decl(a.js, 15, 3)) === tests/cases/conformance/jsdoc/test.ts === declare var actually: Everything<{ a: number }, undefined, { c: 1, d: 1 }, number, string>; diff --git a/tests/baselines/reference/typedefMultipleTypeParameters.types b/tests/baselines/reference/typedefMultipleTypeParameters.types index 5bc38bb835b..ba3456b7faa 100644 --- a/tests/baselines/reference/typedefMultipleTypeParameters.types +++ b/tests/baselines/reference/typedefMultipleTypeParameters.types @@ -11,7 +11,6 @@ var tuvwx; >tuvwx : { t: { a: number; b: "hi"; c: never; }; u: undefined; v: { c: true; d: 1; }; w: number; x: string; } -// TODO: will error when #24592 is fixed /** @type {Everything<{ a: number }, undefined, { c: 1, d: 1 }, number, string>} */ var wrong; >wrong : { t: { a: number; }; u: undefined; v: { c: 1; d: 1; }; w: number; x: string; } diff --git a/tests/cases/conformance/jsdoc/checkJsdocTypeTag4.ts b/tests/cases/conformance/jsdoc/checkJsdocTypeTag4.ts new file mode 100644 index 00000000000..63eae378b9e --- /dev/null +++ b/tests/cases/conformance/jsdoc/checkJsdocTypeTag4.ts @@ -0,0 +1,16 @@ +// @checkJs: true +// @allowJs: true +// @noEmit: true + +// @Filename: t.d.ts +type A = { a: T } + +// @Filename: test.js +/** Also should error for jsdoc typedefs + * @template {string} U + * @typedef {{ b: U }} B + */ +/** @type {A} */ +var a; +/** @type {B} */ +var b; diff --git a/tests/cases/conformance/jsdoc/typedefMultipleTypeParameters.ts b/tests/cases/conformance/jsdoc/typedefMultipleTypeParameters.ts index 9fc7c0d0d41..d70f1d6ef4d 100644 --- a/tests/cases/conformance/jsdoc/typedefMultipleTypeParameters.ts +++ b/tests/cases/conformance/jsdoc/typedefMultipleTypeParameters.ts @@ -13,7 +13,6 @@ /** @type {Everything<{ a: number, b: 'hi', c: never }, undefined, { c: true, d: 1 }, number, string>} */ var tuvwx; -// TODO: will error when #24592 is fixed /** @type {Everything<{ a: number }, undefined, { c: 1, d: 1 }, number, string>} */ var wrong;