如何用JSDoc语法实现TypeScript中的标记类型(品牌类型)?
用JSDoc实现区分不同数字类型的标记类型功能
可以用JSDoc实现类似TypeScript标记类型的效果,在开发阶段区分不同语义的数字类型,具体写法如下:
1. 定义带标记的数字类型
通过@typedef结合@property给原始number类型添加一个虚拟的标记属性,以此区分不同类型:
/** * @typedef {number} MilliSeconds * @property {'MilliSeconds'} _tag 用于区分毫秒类型的标记(仅用于类型检查,运行时不存在) */ /** * @typedef {number} MicroSeconds * @property {'MicroSeconds'} _tag 用于区分微秒类型的标记(仅用于类型检查,运行时不存在) */
2. 使用标记类型
在变量、函数参数或返回值上用@type标注定义好的类型,支持JSDoc的IDE(如VS Code)会提供类型校验:
/** @type {MilliSeconds} */ const timeout = 100; /** @type {MicroSeconds} */ const delay = 100000; // 错误示例:将MicroSeconds赋值给MilliSeconds会触发类型警告 /** @type {MilliSeconds} */ const invalidAssignment = delay;
这种方式和TypeScript的交叉类型实现逻辑一致:都是通过添加唯一标记属性来实现标称类型的区分,运行时变量本质还是普通数字,但开发阶段能有效避免不同语义数字的混用。
内容的提问来源于stack exchange,提问作者Paul Irish
相关产品推荐
相关产品推荐

