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

如何实现类型安全的TypeScript泛型对象属性更新函数?

实现类型安全的对象属性更新方法

可以通过TypeScript的泛型约束实现这个需求,让payload的类型严格对应你传入的propName,比单纯用联合类型更精准,能在编译阶段就拦截类型错误。

修改后的代码如下:

interface ICase {
  caseDetails: ICaseDetails;
  observations: IObservations;
}
interface ICaseDetails {
  a: string;
}
interface IObservations {
  b: number;
}

// 用泛型K约束propName的类型,payload自动对应ICase[K]的类型
const updateCasePart = <K extends keyof ICase>(
  state: ICase,
  payload: ICase[K],
  propName: K
) => { 
  state[propName] = payload;
};

效果验证

  • 正确调用示例:

    const myCase: ICase = {
      caseDetails: { a: "test" },
      observations: { b: 123 }
    };
    
    // 传入caseDetails时,payload必须符合ICaseDetails类型
    updateCasePart(myCase, { a: "new value" }, "caseDetails");
    // 传入observations时,payload必须符合IObservations类型
    updateCasePart(myCase, { b: 456 }, "observations");
    
  • 错误调用会直接触发TypeScript报错:

    // 报错:类型"{ b: string; }"不能赋值给类型"ICaseDetails"
    updateCasePart(myCase, { b: "wrong type" }, "caseDetails");
    

这种写法的核心是利用泛型K关联propName和payload的类型,TypeScript会根据你传入的propName自动推导payload的正确类型,完全满足你想要的“payload类型随propName动态变化”的需求。

内容的提问来源于stack exchange,提问作者mark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:50:27