JSDoc,类型变量

JSDoc, type variables

我们可以在 JSDoc 中使用类型变量吗? 例如我想定义恒等函数:

/**
 * @param {a} x
 * @return {a}
 */
const id = x => x;

但是当我将它用于具体类型 id(2) 时,编辑器总是抱怨类型 number 无法分配给类型 a。我理解为什么在 Haskell 或其他类似语言中,注释中的小写名称被视为类型变量,但 JS 将其视为音乐会类型。 那么有没有办法在JSDoc?

中定义类型变量

PS: 是的,我知道有TS和Flow,我应该使用它们而不是玩注释,但是我现在正在做的项目还没有准备好迁移到TS,但同时我想只使用 JS 使事情尽可能安全。

我认为您是在要求 @param 类型始终与 @return 类型相同的方法的类型定义?

借用自the Closure Compiler's Wiki: Declaring a bounded generic type

 /**
  * @param {A} x
  * @template A
  * @return {A}
  */
 const id = (x) => x;

 /** @type {string} */
 let str='';

 /** @type {number} */
 let num=1;

 str=id(true); // Type warning.

 str=id('string'); // Type safe.

 str=id(1234); // Type warning.

 num=id(true); // Type warning.

 num=id('string'); // Type warning.

 num=id(1234); // Type safe.

产生以下警告:

JSC_TYPE_MISMATCH: assignment
found   : boolean
required: string at line 16 character 0
str=id(true)
^
JSC_TYPE_MISMATCH: assignment
found   : number
required: string at line 20 character 0
str=id(1234)
^
JSC_TYPE_MISMATCH: assignment
found   : boolean
required: number at line 22 character 0
num=id(true)
^
JSC_TYPE_MISMATCH: assignment
found   : string
required: number at line 24 character 0
num=id('string')