diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index bf198f02e91..48eef5c0956 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8773,12 +8773,8 @@ namespace ts { } } if (isInJSFile(declaration)) { - const typeTag = getJSDocType(func); - if (typeTag && isFunctionTypeNode(typeTag)) { - const signature = getSignatureFromDeclaration(typeTag); - const pos = func.parameters.indexOf(declaration); - return declaration.dotDotDotToken ? getRestTypeAtPosition(signature, pos) : getTypeAtPosition(signature, pos); - } + const type = getParameterTypeOfTypeTag(func, declaration); + if (type) return type; } // Use contextual parameter type if one is available const type = declaration.symbol.escapedName === InternalSymbolName.This ? getContextualThisParameterType(func) : getContextuallyTypedParameterType(declaration); @@ -12776,6 +12772,13 @@ namespace ts { return typeTag?.typeExpression && getSingleCallSignature(getTypeFromTypeNode(typeTag.typeExpression)); } + function getParameterTypeOfTypeTag(func: FunctionLikeDeclaration, parameter: ParameterDeclaration) { + const signature = getSignatureOfTypeTag(func); + if (!signature) return undefined; + const pos = func.parameters.indexOf(parameter); + return parameter.dotDotDotToken ? getRestTypeAtPosition(signature, pos) : getTypeAtPosition(signature, pos); + } + function getReturnTypeOfTypeTag(node: SignatureDeclaration | JSDocSignature) { const signature = getSignatureOfTypeTag(node); return signature && getReturnTypeOfSignature(signature); diff --git a/tests/baselines/reference/checkJsdocTypeTag7.symbols b/tests/baselines/reference/checkJsdocTypeTag7.symbols new file mode 100644 index 00000000000..7013bb921a5 --- /dev/null +++ b/tests/baselines/reference/checkJsdocTypeTag7.symbols @@ -0,0 +1,15 @@ +=== tests/cases/conformance/jsdoc/test.js === +/** + * @typedef {(a: string, b: number) => void} Foo + */ + +class C { +>C : Symbol(C, Decl(test.js, 0, 0)) + + /** @type {Foo} */ + foo(a, b) {} +>foo : Symbol(C.foo, Decl(test.js, 4, 9)) +>a : Symbol(a, Decl(test.js, 6, 8)) +>b : Symbol(b, Decl(test.js, 6, 10)) +} + diff --git a/tests/baselines/reference/checkJsdocTypeTag7.types b/tests/baselines/reference/checkJsdocTypeTag7.types new file mode 100644 index 00000000000..f4aac580fee --- /dev/null +++ b/tests/baselines/reference/checkJsdocTypeTag7.types @@ -0,0 +1,15 @@ +=== tests/cases/conformance/jsdoc/test.js === +/** + * @typedef {(a: string, b: number) => void} Foo + */ + +class C { +>C : C + + /** @type {Foo} */ + foo(a, b) {} +>foo : (a: string, b: number) => void +>a : string +>b : number +} + diff --git a/tests/cases/conformance/jsdoc/checkJsdocTypeTag7.ts b/tests/cases/conformance/jsdoc/checkJsdocTypeTag7.ts new file mode 100644 index 00000000000..c65b206a859 --- /dev/null +++ b/tests/cases/conformance/jsdoc/checkJsdocTypeTag7.ts @@ -0,0 +1,13 @@ +// @checkJs: true +// @allowJs: true +// @noEmit: true +// @Filename: test.js + +/** + * @typedef {(a: string, b: number) => void} Foo + */ + +class C { + /** @type {Foo} */ + foo(a, b) {} +}