diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ad8c6b999154e..296cf555d03dc 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -12182,8 +12182,7 @@ namespace ts { // 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); + return typeTag?.typeExpression && getSingleCallSignature(getTypeFromTypeNode(typeTag.typeExpression)); } function getReturnTypeOfTypeTag(node: SignatureDeclaration | JSDocSignature) { diff --git a/tests/baselines/reference/typeTagNoErasure.errors.txt b/tests/baselines/reference/typeTagNoErasure.errors.txt new file mode 100644 index 0000000000000..12bacf60e32be --- /dev/null +++ b/tests/baselines/reference/typeTagNoErasure.errors.txt @@ -0,0 +1,14 @@ +tests/cases/conformance/jsdoc/typeTagNoErasure.js(7,6): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'. + + +==== tests/cases/conformance/jsdoc/typeTagNoErasure.js (1 errors) ==== + /** @template T @typedef {(data: T1) => T1} Test */ + + /** @type {Test} */ + const test = dibbity => dibbity + + test(1) // ok, T=1 + test('hi') // error, T=number + ~~~~ +!!! error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'. + \ No newline at end of file diff --git a/tests/baselines/reference/typeTagNoErasure.js b/tests/baselines/reference/typeTagNoErasure.js new file mode 100644 index 0000000000000..874978366c2a1 --- /dev/null +++ b/tests/baselines/reference/typeTagNoErasure.js @@ -0,0 +1,23 @@ +//// [typeTagNoErasure.js] +/** @template T @typedef {(data: T1) => T1} Test */ + +/** @type {Test} */ +const test = dibbity => dibbity + +test(1) // ok, T=1 +test('hi') // error, T=number + + +//// [typeTagNoErasure.js] +/** @template T @typedef {(data: T1) => T1} Test */ +/** @type {Test} */ +var test = function (dibbity) { return dibbity; }; +test(1); // ok, T=1 +test('hi'); // error, T=number + + +//// [typeTagNoErasure.d.ts] +/** @template T @typedef {(data: T1) => T1} Test */ +/** @type {Test} */ +declare const test: Test; +type Test = (data: T1) => T1; diff --git a/tests/baselines/reference/typeTagNoErasure.symbols b/tests/baselines/reference/typeTagNoErasure.symbols new file mode 100644 index 0000000000000..5b8403963c4ee --- /dev/null +++ b/tests/baselines/reference/typeTagNoErasure.symbols @@ -0,0 +1,15 @@ +=== tests/cases/conformance/jsdoc/typeTagNoErasure.js === +/** @template T @typedef {(data: T1) => T1} Test */ + +/** @type {Test} */ +const test = dibbity => dibbity +>test : Symbol(test, Decl(typeTagNoErasure.js, 3, 5)) +>dibbity : Symbol(dibbity, Decl(typeTagNoErasure.js, 3, 12)) +>dibbity : Symbol(dibbity, Decl(typeTagNoErasure.js, 3, 12)) + +test(1) // ok, T=1 +>test : Symbol(test, Decl(typeTagNoErasure.js, 3, 5)) + +test('hi') // error, T=number +>test : Symbol(test, Decl(typeTagNoErasure.js, 3, 5)) + diff --git a/tests/baselines/reference/typeTagNoErasure.types b/tests/baselines/reference/typeTagNoErasure.types new file mode 100644 index 0000000000000..b2a40f16662e9 --- /dev/null +++ b/tests/baselines/reference/typeTagNoErasure.types @@ -0,0 +1,20 @@ +=== tests/cases/conformance/jsdoc/typeTagNoErasure.js === +/** @template T @typedef {(data: T1) => T1} Test */ + +/** @type {Test} */ +const test = dibbity => dibbity +>test : Test +>dibbity => dibbity : (dibbity: T1) => T1 +>dibbity : T1 +>dibbity : T1 + +test(1) // ok, T=1 +>test(1) : 1 +>test : Test +>1 : 1 + +test('hi') // error, T=number +>test('hi') : number +>test : Test +>'hi' : "hi" + diff --git a/tests/cases/conformance/jsdoc/typeTagNoErasure.ts b/tests/cases/conformance/jsdoc/typeTagNoErasure.ts new file mode 100644 index 0000000000000..d5889d5e5dd95 --- /dev/null +++ b/tests/cases/conformance/jsdoc/typeTagNoErasure.ts @@ -0,0 +1,11 @@ +// @checkJs:true +// @declaration: true +// @outdir: out/ +// @filename: typeTagNoErasure.js +/** @template T @typedef {(data: T1) => T1} Test */ + +/** @type {Test} */ +const test = dibbity => dibbity + +test(1) // ok, T=1 +test('hi') // error, T=number