diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 4fe8e264e559b..1fbaaaaba5ccf 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10701,7 +10701,9 @@ namespace ts { } function getSignatureOfTypeTag(node: SignatureDeclaration | JSDocSignature) { - const typeTag = isInJSFile(node) ? getJSDocTypeTag(node) : undefined; + // should be attached to a function declaration or expression + if (!(isInJSFile(node) && isFunctionLikeDeclaration(node))) return undefined; + const typeTag = getJSDocTypeTag(node); const signature = typeTag && typeTag.typeExpression && getSingleCallSignature(getTypeFromTypeNode(typeTag.typeExpression)); return signature && getErasedSignature(signature); } diff --git a/tests/baselines/reference/jsdocCallbackAndType.errors.txt b/tests/baselines/reference/jsdocCallbackAndType.errors.txt new file mode 100644 index 0000000000000..b3a6719491c7d --- /dev/null +++ b/tests/baselines/reference/jsdocCallbackAndType.errors.txt @@ -0,0 +1,15 @@ +/a.js(8,3): error TS2554: Expected 0 arguments, but got 1. + + +==== /a.js (1 errors) ==== + /** + * @template T + * @callback B + */ + /** @type {B} */ + let b; + b(); + b(1); + ~ +!!! error TS2554: Expected 0 arguments, but got 1. + \ No newline at end of file diff --git a/tests/baselines/reference/jsdocCallbackAndType.symbols b/tests/baselines/reference/jsdocCallbackAndType.symbols new file mode 100644 index 0000000000000..9aae8dbbfe2e6 --- /dev/null +++ b/tests/baselines/reference/jsdocCallbackAndType.symbols @@ -0,0 +1,15 @@ +=== /a.js === +/** + * @template T + * @callback B + */ +/** @type {B} */ +let b; +>b : Symbol(b, Decl(a.js, 5, 3)) + +b(); +>b : Symbol(b, Decl(a.js, 5, 3)) + +b(1); +>b : Symbol(b, Decl(a.js, 5, 3)) + diff --git a/tests/baselines/reference/jsdocCallbackAndType.types b/tests/baselines/reference/jsdocCallbackAndType.types new file mode 100644 index 0000000000000..926a452574c90 --- /dev/null +++ b/tests/baselines/reference/jsdocCallbackAndType.types @@ -0,0 +1,18 @@ +=== /a.js === +/** + * @template T + * @callback B + */ +/** @type {B} */ +let b; +>b : B + +b(); +>b() : any +>b : B + +b(1); +>b(1) : any +>b : B +>1 : 1 + diff --git a/tests/cases/compiler/jsdocCallbackAndType.ts b/tests/cases/compiler/jsdocCallbackAndType.ts new file mode 100644 index 0000000000000..eaecc38135c9f --- /dev/null +++ b/tests/cases/compiler/jsdocCallbackAndType.ts @@ -0,0 +1,13 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true + +// @Filename: /a.js +/** + * @template T + * @callback B + */ +/** @type {B} */ +let b; +b(); +b(1);