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。
相关产品推荐
相关产品推荐

