diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 8e1235f8452..a3f53cf29c9 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -30833,6 +30833,10 @@ namespace ts { } } + function checkJSDocPropertyTag(node: JSDocPropertyTag) { + checkSourceElement(node.typeExpression); + } + function checkJSDocFunctionType(node: JSDocFunctionType): void { if (produceDiagnostics && !node.type && !isJSDocConstructSignature(node)) { reportImplicitAny(node, anyType); @@ -34362,6 +34366,8 @@ namespace ts { return checkJSDocTypeTag(node as JSDocTypeTag); case SyntaxKind.JSDocParameterTag: return checkJSDocParameterTag(node as JSDocParameterTag); + case SyntaxKind.JSDocPropertyTag: + return checkJSDocPropertyTag(node as JSDocPropertyTag); case SyntaxKind.JSDocFunctionType: checkJSDocFunctionType(node as JSDocFunctionType); // falls through diff --git a/tests/baselines/reference/jsdocPropertyTagInvalid.errors.txt b/tests/baselines/reference/jsdocPropertyTagInvalid.errors.txt new file mode 100644 index 00000000000..f880d5657c8 --- /dev/null +++ b/tests/baselines/reference/jsdocPropertyTagInvalid.errors.txt @@ -0,0 +1,18 @@ +/a.js(3,15): error TS2304: Cannot find name 'sting'. + + +==== /a.js (1 errors) ==== + /** + * @typedef MyType + * @property {sting} [x] + ~~~~~ +!!! error TS2304: Cannot find name 'sting'. + */ + + /** @param {MyType} p */ + export function f(p) { } + +==== /b.js (0 errors) ==== + import { f } from "./a.js" + f({ x: 42 }) + \ No newline at end of file diff --git a/tests/baselines/reference/jsdocPropertyTagInvalid.symbols b/tests/baselines/reference/jsdocPropertyTagInvalid.symbols new file mode 100644 index 00000000000..9c14e3d502c --- /dev/null +++ b/tests/baselines/reference/jsdocPropertyTagInvalid.symbols @@ -0,0 +1,19 @@ +=== /a.js === +/** + * @typedef MyType + * @property {sting} [x] + */ + +/** @param {MyType} p */ +export function f(p) { } +>f : Symbol(f, Decl(a.js, 0, 0)) +>p : Symbol(p, Decl(a.js, 6, 18)) + +=== /b.js === +import { f } from "./a.js" +>f : Symbol(f, Decl(b.js, 0, 8)) + +f({ x: 42 }) +>f : Symbol(f, Decl(b.js, 0, 8)) +>x : Symbol(x, Decl(b.js, 1, 3)) + diff --git a/tests/baselines/reference/jsdocPropertyTagInvalid.types b/tests/baselines/reference/jsdocPropertyTagInvalid.types new file mode 100644 index 00000000000..1951ce779f2 --- /dev/null +++ b/tests/baselines/reference/jsdocPropertyTagInvalid.types @@ -0,0 +1,22 @@ +=== /a.js === +/** + * @typedef MyType + * @property {sting} [x] + */ + +/** @param {MyType} p */ +export function f(p) { } +>f : (p: MyType) => void +>p : MyType + +=== /b.js === +import { f } from "./a.js" +>f : (p: import("/a").MyType) => void + +f({ x: 42 }) +>f({ x: 42 }) : void +>f : (p: import("/a").MyType) => void +>{ x: 42 } : { x: number; } +>x : number +>42 : 42 + diff --git a/tests/cases/compiler/jsdocPropertyTagInvalid.ts b/tests/cases/compiler/jsdocPropertyTagInvalid.ts new file mode 100644 index 00000000000..6bd39f60564 --- /dev/null +++ b/tests/cases/compiler/jsdocPropertyTagInvalid.ts @@ -0,0 +1,16 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true + +// @Filename: /a.js +/** + * @typedef MyType + * @property {sting} [x] + */ + +/** @param {MyType} p */ +export function f(p) { } + +// @Filename: /b.js +import { f } from "./a.js" +f({ x: 42 })