2016-08-03 34 views
0

Ich habe eine Karte von Klassen, die eine Klasse FrameModel erweitern, siehe TypeScript - storing a class as a map value?.TypeScript - Fenster <Typeof FrameModel> kann nicht erneut eingegeben werden ["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; 
} 

jedoch TS nicht wie die die letzte Zeile, sagen „Fehler TS2352:. Weder Typ‚Fenster‘noch Typ‚typeof FrameModel‘auf die andere zuweisbare ist“

In lib.d.ts, die Definition ist: declare var window: Window; Warum dies auch auf die Eigenschaften von window ist TS gelten?

Ich kann das mit <any> verhindern, aber ich habe mich gefragt, wie es richtig geht.
Beachten Sie, dass ich den Namen der Eigenschaft im Voraus nicht kennen, so kann ich etwas wie declare window.MyClass: FrameModel nicht tun.

Antwort

0

Ihre Iteration ist falsch.

Es sollte entweder:

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

Oder:

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

Oder mit der forEach:

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

Der Grund Sie diesen Fehler erhalten, weil die Window interface hat eine Menge von benannten Eigenschaften und dann at the end:

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

Das bedeutet, dass alles, auf das Sie in Window mit einem Index zugreifen, vom Typ Window ist.
Um Bypass, der gerade zu gieße any:

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