You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过JSDoc为JS类的条件属性配置正确的TypeScript类型?

解决方案:用JSDoc泛型+构造函数重载实现条件类型推断

你需要通过JSDoc泛型绑定+构造函数重载,让TypeScript根据传入的配置参数,自动识别ExampleClass实例是否包含property属性,具体实现如下:

1. 定义参数与实例的关联条件类型

先通过@typedef结合TypeScript条件类型,把配置参数和实例类型绑定:

/**
 * @template {ExampleOptions} T
 * @typedef {T extends {option: true} ? { property: boolean } : { property?: never }} ExampleInstance
 */

这个类型的逻辑是:如果传入的参数T包含option: true,实例就带必填的property;否则实例的property为可选且类型为never(等同于不存在)。

2. 给构造函数添加重载签名

用@overload定义两种调用场景,让TypeScript能根据传入参数匹配对应实例类型:

/**
 * @overload
 * @param {{option: true}} param
 * @returns {ExampleInstance<{option: true}>}
 */
/**
 * @overload
 * @param {Omit<ExampleOptions, 'option'> | undefined} param
 * @returns {ExampleInstance<Omit<ExampleOptions, 'option'>>}
 */
/**
 * A thing that does stuff
 * @constructor
 * @param {ExampleOptions} [param] Options you can use to configure the new instance
 */
function ExampleClass(param) {
    if (param?.option === true) {
        /** @type {boolean} */
        this.property = true;
    }
}

两个重载分别对应:

  • 传入{option: true}时,返回带必填property的实例
  • 不传参数或传不带option的对象时,返回property可选/不存在的实例

3. 修正原有配置类型定义

把ExampleOptions里的option类型调整为更准确的boolean | undefined:

/**
 * Settings you can use to configure an instance of an ExampleClass
 * @typedef {Object} ExampleOptions
 * @property {boolean} [option] Set to `true` to add `property` to the instance; omit or set to false to exclude it
 */

效果验证

  • 当调用const inst1 = new ExampleClass({option: true})时,TypeScript会识别inst1.property为必填boolean,可直接使用无需检查
  • 当调用const inst2 = new ExampleClass()或new ExampleClass({option: false})时,inst2.property会被标记为可选,编辑器会提示你访问前需先判断是否存在

内容的提问来源于stack exchange,提问作者Michael Hulet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:55:25