TypeScript如何实现函数参数与对象属性的类型共享
TypeScript 函数参数与对象属性类型同步实现方案
核心思路是利用TypeScript对带标签元组的隐式转换能力,自定义工具类型把Parameters获取的参数元组直接转为同键名、同类型的对象结构,实现两边类型自动同步,不需要重复维护类型定义。
核心工具类型
type ParamsToObj<F extends (...args: any) => any> = (...args: Parameters<F>) => void extends (arg: infer ArgObj) => void ? ArgObj : never
这个工具类型利用了TS的内置类型推导规则:当剩余参数元组被约束为单个函数参数时,TS会自动把带参数名标签的元组转换为键为参数名、值为参数类型的普通对象,不需要手动做递归映射匹配。
完整使用示例
// 原函数定义 const f = (param1: string, param2: number, param3: boolean): any => null // n函数的入参数组元素类型直接绑定f的参数结构 const n = (obj: Array<ParamsToObj<typeof f>>): any => null // 合法调用,类型校验完全通过 n([ { param1: "a", param2: 1, param3: true }, { param1: "b", param2: 2, param3: false }, ]) // 以下错误调用会被TS直接拦截 // 1. 缺少参数属性 n([{ param1: "c", param2: 3 }]) // 报错:缺失param3属性 // 2. 属性类型不匹配 n([{ param1: 1, param2: "err", param3: "err" }]) // 报错:所有属性类型不符合要求
自动同步效果
后续只要修改函数f的参数定义(增删参数、修改参数类型/参数名),n函数接收的数组元素类型会自动同步更新,不需要手动维护两边的类型定义,完全避免重复写类型导致的不一致问题。
该方案兼容TypeScript 4.0及以上所有正式版本。
内容的提问来源于stack exchange,提问作者Diego Ulloa
相关产品推荐
相关产品推荐

