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

时间:2017-01-09 15:07:57

标签: 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;
}

在编译时产生错误:

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

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

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

2 个答案:

答案 0 :(得分:4)

我通过交叉类型&lt; T1&amp; T2取代。 https://www.typescriptlang.org/docs/handbook/advanced-types.html

/** Extends objA with properties of objB and returns objA */
function extendObj<T1, T2>(objA: T1, objB: T2): T1 & T2 {
    for (let key in objB) {
        if (objB.hasOwnProperty(key)) {
            (<T1 & T2>objA)[key] = (<T1 & T2>objB)[key];
        }
    }
    return <T1 & T2>objA;
}

/** Creates an object with the specified prototype and properties coming from object (cloned) */
function fromPrototype<T, A>(prototype: T, object: A): T & A {
    // Create the object with the specified prototype
    const newObject = <T & A>Object.create(prototype);

    // Clones properties of the specified object
    for (const prop in object) {
        if (object.hasOwnProperty(prop)) {
            newObject[prop] = (<T & A>object)[prop];
        }
    }

    return newObject;
}

答案 1 :(得分:3)

我认为正确的函数应该看起来like this

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;
}

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

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

我认为编译器的推理是它知道keyT2的有效成员,但它不知道T1这就是为什么我说{{1} }}是objAT1的联合(它不是真的,但我想分配给T2字段)。编译器不区分读写。

我不熟悉swagger-codegen,你对生成的代码有任何控制权,或者你能编辑它吗?