Do not erase signatures in getSignatureOfTypeTag (#43688)

I don't see a reason for it, and it doesn't cause any tests to fail.
This commit is contained in:
Nathan Shively-Sanders
2021-04-15 10:53:23 -07:00
committed by GitHub
parent 931b20af6c
commit 0987ee9e0e
6 changed files with 84 additions and 2 deletions

View File

@@ -12207,8 +12207,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) {

View File

@@ -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 {<T1 extends T>(data: T1) => T1} Test */
/** @type {Test<number>} */
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'.

View File

@@ -0,0 +1,23 @@
//// [typeTagNoErasure.js]
/** @template T @typedef {<T1 extends T>(data: T1) => T1} Test */
/** @type {Test<number>} */
const test = dibbity => dibbity
test(1) // ok, T=1
test('hi') // error, T=number
//// [typeTagNoErasure.js]
/** @template T @typedef {<T1 extends T>(data: T1) => T1} Test */
/** @type {Test<number>} */
var test = function (dibbity) { return dibbity; };
test(1); // ok, T=1
test('hi'); // error, T=number
//// [typeTagNoErasure.d.ts]
/** @template T @typedef {<T1 extends T>(data: T1) => T1} Test */
/** @type {Test<number>} */
declare const test: Test<number>;
type Test<T> = <T1 extends T>(data: T1) => T1;

View File

@@ -0,0 +1,15 @@
=== tests/cases/conformance/jsdoc/typeTagNoErasure.js ===
/** @template T @typedef {<T1 extends T>(data: T1) => T1} Test */
/** @type {Test<number>} */
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))

View File

@@ -0,0 +1,20 @@
=== tests/cases/conformance/jsdoc/typeTagNoErasure.js ===
/** @template T @typedef {<T1 extends T>(data: T1) => T1} Test */
/** @type {Test<number>} */
const test = dibbity => dibbity
>test : Test<number>
>dibbity => dibbity : <T1 extends number>(dibbity: T1) => T1
>dibbity : T1
>dibbity : T1
test(1) // ok, T=1
>test(1) : 1
>test : Test<number>
>1 : 1
test('hi') // error, T=number
>test('hi') : number
>test : Test<number>
>'hi' : "hi"

View File

@@ -0,0 +1,11 @@
// @checkJs:true
// @declaration: true
// @outdir: out/
// @filename: typeTagNoErasure.js
/** @template T @typedef {<T1 extends T>(data: T1) => T1} Test */
/** @type {Test<number>} */
const test = dibbity => dibbity
test(1) // ok, T=1
test('hi') // error, T=number