2017-01-09 294 views
3

招摇-API /招摇-代码生成生成以下代码:TS2536:类型 'keyof T2' 不能被用于索引类型 'T1'

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'

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

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

+0

如果没有保证密钥是相同类型的,我可以看到具有一个问题,因为编译器。如果您将'key'的类型指定为通用类型,会发生什么? – Carcigenicate

+0

它可以工作,如果另一个keyX被声明在周期之外。但这很奇怪。如果它抱怨价值,我会承认,但这是关键。 – user656449

回答

2

我认为正确的功能应该是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这就是为什么我说objAT1T2(工会是不是真的但我想分配到keyof T2字段)。编译器不区分读取和写入。

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

+1

是的,你说得对,我没有仔细阅读关于keyof的信息。现在我懂了。虽然您建议sitll的代码不能编译。然而,这一个虽然:extendObj (objA:T2,objB:T2):T1 | T2 {objB中的let键} {objB.hasOwnProperty(key)){ objA [ key] = objB [key]; } } return objA; – user656449

+0

我的代码编译在打字游乐场(看我的链接) – Motti

+0

和T2延长T1看起来比我的java眼睛更好看比T1 | T2 :) – user656449

1

我已经通过与路口类型铸造来修复它< T1 & 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; 
} 
相关问题