TypeScript动态更新对象属性函数的类型报错问题求助
解决TypeScript动态更新对象属性的类型匹配问题
你遇到的问题核心在于:当前函数中propertyName是keyof MyType的联合类型,TypeScript会把propertyValue推断为所有属性类型的联合(string | number | string[] | undefined),而updatedType[propertyName]的类型是这些属性类型的交集——因为无法确定具体是哪个属性,所以交集是never,导致赋值时报错。
要让TypeScript根据传入的属性名动态匹配对应的值类型,需要用泛型约束把属性名和值的类型绑定起来:
export interface MyType { prop1: string; prop2?: number; prop3?: string[]; } const instanceOfMyType: MyType = { prop1: "hello" } // 使用泛型K绑定属性名和对应值的类型 const updatePropOfMyType = <K extends keyof MyType>( thingBeingUpdated: MyType, propertyName: K, propertyValue: MyType[K] ): MyType => { const updatedType = _.cloneDeep(thingBeingUpdated); updatedType[propertyName] = propertyValue; // 不再报错 return updatedType; };
验证效果
- 正确调用(类型匹配):
const result = updatePropOfMyType(instanceOfMyType, "prop2", 123); // result 类型为 MyType,值为 { prop1: 'hello', prop2: 123 } - 错误调用(类型不匹配):
// TypeScript会直接报错:类型"string"不能赋值给类型"number | undefined" updatePropOfMyType(instanceOfMyType, "prop2", "test");
原理说明
泛型K extends keyof MyType会在函数调用时捕获具体的属性名(比如"prop2"),此时MyType[K]就会被推断为该属性对应的具体类型(number | undefined),而不是所有属性类型的联合。这样TypeScript就能准确校验propertyValue的类型是否与目标属性匹配,同时赋值操作也能通过类型检查。
内容的提问来源于stack exchange,提问作者Jacob Conner
相关产品推荐
相关产品推荐

