2017-01-09 117 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; 
} 
相關問題