TS2536:类型'keyof T2'不能用于索引类型'T1'

use*_*449 8 typescript

swagger-api/swagger-codegen生成以下代码:

private extendObj<T1,T2>(objA: T1, objB: T2) {
    for(let key in objB){
        if(objB.hasOwnProperty(key)){
            objA[key] = objB[key];
        }
    }
    return <T1&T2>objA;
}
Run Code Online (Sandbox Code Playgroud)

这会在编译时产生错误:

TS2536:类型'keyof T2'不能用于索引类型'T1'

有人可以解释为什么一个对象的密钥不能用于访问另一个对象领域吗?是否推断某些特殊类型的关键?

什么是在打字稿中复制对象属性的正确方法?

Mot*_*tti 5

我认为正确的功能应该是这样的

function extendObj<T1,T2>(objA: T1|T2, objB: T2): T1|T2 {
    for(let key in objB){
        if(objB.hasOwnProperty(key)){
            objA[key] = objB[key];
        }
    }
    return objA;
}
Run Code Online (Sandbox Code Playgroud)

返回的类型应该是T1T2( |)的并集,而不是交集 ( &)。

也许您不熟悉keyof它是TypeScript 2.1 中的一项新功能。

我想编译器的推理是它知道这key是一个有效的成员,T2但它不知道T1这就是为什么我说它objAT1and的联合T2(它不是真的,但我想分配给keyof T2字段)。编译器不区分读取和写入。

我不熟悉 swagger-codegen,您是否可以控制或编辑生成的代码?