TypeScript 如何将Parameters<函数>元组转换为带命名字段的对象类型
你要的LibParametersKeyed类型可以直接通过元组的索引访问实现,代码如下:
// 直接基于现有类型转换,和你预期的结构完全等价 type LibParametersKeyed = { data: LibFunctionParameters[0] opts?: LibFunctionParameters[1] }
如果需要适配任意函数参数元组转命名对象,可以封装通用工具类型,后续扩展其他库方法时不需要重复写结构:
// 通用工具类型:第一个参数是函数参数元组,第二个参数是按顺序对应的key名称数组 type TupleToNamedObj<ParamTuple extends any[], KeyArr extends string[]> = { [K in KeyArr[number]]: K extends KeyArr[infer Index extends number] ? ParamTuple[Index] : never } // 调用工具类型生成你要的结构 type LibParametersKeyed = TupleToNamedObj<LibFunctionParameters, ['data', 'opts']>
实际使用示例
你定义的RunSet可以直接用生成的类型,调用第三方库时直接解构参数即可:
type RunSet = { foo: any } & LibParametersKeyed // 实际调用逻辑 function execTask(task: RunSet) { // 拆分自定义字段和库入参 const { foo, data, opts } = task // 直接传入第三方库方法,类型完全匹配 return ExternalLibFunction(data, opts) }
如果是针对xlsx库封装,针对read、write等不同方法,只需要替换ExternalLibFunction为对应的库方法类型,就能自动同步参数类型,不需要手动修改LibParametersKeyed的结构。
内容的提问来源于stack exchange,提问作者ndemasie
相关产品推荐
相关产品推荐

