TypeScript泛型生成setter时T[keyof T]类型合并问题如何解决
解决方案
你的问题根因为返回值类型使用T[keyof T]会将所有属性类型合并为联合类型,所有setter的参数都共享全属性类型合集。需要改用映射类型为每个单独的属性键生成对应的setter类型,将参数和对应属性的类型一一绑定,同时补充运行时的setter方法名逻辑,保证类型定义和实际运行行为一致。
修改后的完整代码如下:
// 示例对象 const obj = { role: 'admin', user: { id: 1, name: 'vasa', }, } // 修正后的泛型函数 const fun = <T extends Record<string, any>>(obj: T): { // 遍历每个属性键生成对应的setter方法定义 [K in keyof T as `set${Capitalize<string & K>}`]: (value: T[K]) => void } => { const action: any = {} for(const key in obj){ // 运行时生成和类型定义一致的setter方法名 const setterName = `set${key.charAt(0).toUpperCase() + key.slice(1)}` action[setterName] = (value: any) => { console.log(value) // 若需要修改原对象可补充下方逻辑 // obj[key] = value } } return action } const action = fun(obj) // 现在类型校验符合预期: action.setRole('superAdmin') // 类型校验通过 action.setUser({id: 2, name: 'newUser'}) // 类型校验通过 action.setRole({id: 2, name: 'bug'}) // 类型校验抛出错误,提示参数类型不匹配
核心修改说明
- 替换原有的
Record统一类型定义为映射类型,逐个遍历对象属性键,每个键单独对应自身的属性类型T[K],不会产生跨属性的类型联合 - 补充运行时的setter方法名首字母大写逻辑,保证类型定义和实际运行的方法名一致,避免出现类型合法但运行时找不到方法的问题
内容的提问来源于stack exchange,提问作者Vasa
相关产品推荐
相关产品推荐

