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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:28:22