2016-08-03 25 views
0

我有擴展類FrameModel的類的映射,請參見TypeScript - storing a class as a map value?TypeScript - 無法重新輸入<typeof FrameModel> window [「FrameModel」];

static mapping: { [key: string]: typeof FrameModel } = { 

for (var key in Object.keys(window)){ 
    var val = window[key]; 
    // ... some checks ... 
    DiscriminatorMapping.mapping[key] = <typeof FrameModel> val; 
} 

然而,TS不喜歡最後一行,並稱「錯誤TS2352:無論是類型‘窗口’NOR型‘的typeof FrameModel’是分配給其他的。」

lib.d.ts的定義是:declare var window: Window; 爲什麼TS應用此的window過的屬性?

我可以防止與<any>,但我想知道如何正確地做到這一點。
請注意,我不知道該物業的名稱,所以我不能做像declare window.MyClass: FrameModel

回答

0

你的迭代是錯誤的。

它要麼是:

for (var key in window) { 
    var val = window[key]; 
    ... 
} 

或者:

let keys = Object.keys(window); 
for (var i in keys) { 
    let key = keys[i]; 
    let val = window[key]; 
    ... 
} 

或者使用foreach:

Object.keys(window).forEach(key => { 
    let val = window[key]; 
    ... 
}); 

你得到錯誤的原因是因爲Window interface有很多命名的屬性,然後at the end

interface Window { 
    ... 
    [index: number]: Window; 
} 

這意味着您使用索引在Window中訪問的任何內容都是Window
要繞過只投到any

for (var key in window) { 
    var val = window[key] as any; 
    // ... some checks ... 
    DiscriminatorMapping.mapping[key] = <typeof FrameModel> val; 
}