TypeScript动态赋值类型错误求解:跨对象属性赋值问题
TypeScript动态赋值类型错误的解决方案
你这段代码报错是因为TypeScript没法在循环里精准推断每个key对应的类型。obj1的a是number类型、b是string类型,obj2的a是number、b是string,但循环时obj2[_key]会被推断成string | number,而obj1[_key]是对应key的具体类型(比如a是number),TypeScript认为这两种类型无法安全匹配,所以抛出了类型不兼容的错误。
以下是几种可行的解决方案:
方案1:类型断言明确类型
在赋值时用类型断言,告诉TypeScript当前赋值的类型和目标属性类型一致:
const obj1 = { a: 1, b: "xx" }; const obj2 = { a: 2, b: "3", d: "hello" }; for (const key in obj1) { const _key = key as keyof typeof obj1; obj1[_key] = obj2[_key] as typeof obj1[typeof _key]; }
方案2:定义公共键数组+泛型函数(更安全)
先明确两个对象的公共键,用泛型函数来保证赋值时的类型安全,避免类型断言的潜在风险:
const obj1 = { a: 1, b: "xx" }; const obj2 = { a: 2, b: "3", d: "hello" }; // 定义公共键数组,TypeScript会自动校验键是否存在于两个对象中 const commonKeys: (keyof typeof obj1 & keyof typeof obj2)[] = ['a', 'b']; function assignKey<T, K extends keyof T>(target: T, source: Partial<T>, key: K) { target[key] = source[key]!; } commonKeys.forEach(key => { assignKey(obj1, obj2, key); });
这里用Partial<T>允许source只包含T的部分属性,泛型K确保key同时属于两个对象的键,赋值时类型完全匹配。
方案3:使用Object.assign(简洁但需过滤键)
如果只需要复制公共键,可以先过滤出obj2中的公共键属性,再用Object.assign:
const obj1 = { a: 1, b: "xx" }; const obj2 = { a: 2, b: "3", d: "hello" }; // 过滤出obj2中存在于obj1的键 const filteredObj2 = Object.fromEntries( Object.entries(obj2).filter(([key]) => key in obj1) ) as Pick<typeof obj2, keyof typeof obj1>; Object.assign(obj1, filteredObj2);
Pick<typeof obj2, keyof typeof obj1>确保过滤后的对象类型和obj1的键对应类型一致,避免类型错误。
内容的提问来源于stack exchange,提问作者river
相关产品推荐
相关产品推荐

