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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:15:11