如何实现类型安全的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
相关产品推荐
相关产品推荐

