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

TypeScript如何正确定义函数对象对应数组的DataTypes类型

问题原因

你当前的DataTypes类型定义本身没有逻辑错误,报错是因为TypeScript无法自动跟踪联合类型中type字段和arg字段的关联关系:当你把dataItem拆解为独立的func和arg变量后,TS会把func的入参推导为所有函数参数的交叉类型number & string & boolean(也就是never类型),因此抛出参数不匹配的错误。

解决方案

方案1:封装泛型调用函数(推荐,类型最安全)

通过泛型函数绑定type和arg的类型关联,无需修改原有类型定义:

type TypeOfObject = typeof objectOfFunctions;
type ObjectKeys = keyof TypeOfObject;

// 封装泛型调用函数,自动关联类型
function callFunc<T extends ObjectKeys>(type: T, arg: Parameters<TypeOfObject[T]>[0]) {
  objectOfFunctions[type](arg);
}

data.forEach((dataItem) => {
  callFunc(dataItem.type, dataItem.arg);
});

方案2:自动生成联合类型(优化可维护性)

如果不希望每次新增objectOfFunctions的方法都手动修改DataTypes的枚举,可通过映射类型自动生成联合类型:

type TypeOfObject = typeof objectOfFunctions;
type ObjectKeys = keyof TypeOfObject;

// 自动生成所有合法数据项的联合类型,无需手动枚举
type DataItem = {
  [K in ObjectKeys]: {
    type: K;
    arg: Parameters<TypeOfObject[K]>[0];
  }
}[ObjectKeys];

type DataTypes = DataItem[];

生成的DataItem和你手动编写的联合类型完全等价,后续新增方法会自动适配类型。

临时方案:类型断言(不推荐,会跳过类型校验)

如果只是需要快速解决报错,可以使用类型断言绕过校验,但存在类型安全风险:

data.forEach((dataItem) => {
  const func = objectOfFunctions[dataItem.type];
  const {arg} = dataItem;
  func(arg as Parameters<typeof func>[0]);
})

内容的提问来源于stack exchange,提问作者Anton。

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:27:01