我们可以在 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')
关于JSDoc,类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59243543/