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')

关于JSDoc,类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59243543/

相关文章:

javascript - 如何用ngdocs描述一个提供函数集合的返回对象?

java - 通配符和类型变量有什么区别?

javascript - 在匿名函数中注释参数

html - 使用 VS 代码从 HTML `<script>` 引用 TypeScript 定义文件

javascript - Visual Studio Web Essentials JSDoc intellisense 在构造函数中分配的方法不起作用?

javascript - react 代码中的@internal JavaScript 文档标记,这是 jsdoc、闭包还是其他?

haskell - ScopedTypeVariables 不会将类型变量带入作用域

haskell - Free Pascal 有像 Haskell 那样的类型变量吗?

generics - F# 使用类型变量调用内联函数