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

如何用JSDoc为解构剩余参数添加类型标注以兼容TypeScript?

如何用JSDoc为解构剩余参数添加类型标注以兼容TypeScript?

我之前也踩过这个坑!TypeScript对JSDoc里的对象解构剩余属性的类型标注确实有特殊要求,你之前尝试的@param {...object} [props.rest]之所以报错,是因为JSDoc里的...语法在这里会被TypeScript误解为函数的剩余参数(比如function fn(...args) {}这种),而不是对象解构出来的剩余属性,所以它才会抱怨“剩余参数必须在参数列表最后”——但我们这里根本不是函数的剩余参数,而是对象内部的属性,自然不适用这个语法。

给你两个纯JSDoc的解决方案,都不需要依赖任何外部类型,完全符合你的需求:

方案一:用@typedef定义基础类型+交叉类型

先把必填的props类型单独定义出来,再和一个允许任意额外属性的类型交叉,这样既清晰又灵活:

/**
 * @typedef {Object} FooBaseProps
 * @property {string} a - 字符串类型的必填属性
 * @property {number} b - 数字类型的必填属性
 */

/**
 * 示例函数,接受固定属性a、b和任意额外属性
 * @param {FooBaseProps & Record<string, unknown>} props - 包含固定属性和任意额外属性的对象
 */
function Foo({ a, b, ...rest }) {
  // 这里可以正常使用rest里的额外属性
  console.log(rest);
  return `<h1>Hello World!</h1>`;
}

// 现在调用时传入额外属性bar,TypeScript不会报错了
Foo({ a: "foo", b: 5, bar: "baz" });

方案二:直接在@param里写带索引签名的对象类型

如果你的场景比较简单,不想单独定义typedef,也可以直接在@param的对象类型里添加索引签名,一步到位:

/**
 * 示例函数,接受固定属性a、b和任意额外属性
 * @param {{ a: string; b: number; [key: string]: unknown }} props
 */
function Foo({ a, b, ...rest }) {
  console.log(rest);
  return `<h1>Hello World!</h1>`;
}

// 同样可以正常传入bar等额外属性
Foo({ a: "foo", b: 5, bar: "baz" });

这两种方案的核心都是明确告诉TypeScript:这个props对象除了a和b,还可以包含任意键名、任意类型(这里用unknown是最安全的,你也可以换成更具体的类型比如string/number等)的额外属性。

之前你遇到的问题本质是混淆了“函数剩余参数”和“对象解构剩余属性”的JSDoc标注方式,现在用上面的方法就能完美解决,而且完全是纯JSDoc实现,不需要依赖任何外部类型定义。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 13:24:32