TypeScript - 无法重新输入<typeof framemodel =“”> window [“FrameModel”];

时间:2016-08-03 21:29:35

标签: typescript casting window

我有一个扩展课程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; } 的课程地图,请参阅TypeScript - storing a class as a map value?

lib.d.ts

然而,TS不喜欢最后一行,说“错误TS2352:既没有类型'Window'也没有类型'typeof FrameModel'可以分配给另一个。”

declare var window: Window;中,定义为:window 为什么TS也将此应用于<any>的属性?

我可以用declare window.MyClass: FrameModel来阻止这种情况,但我想知道如何正确地做到这一点  请注意,我事先并不知道该属性的名称,因此我无法执行{{1}}之类的操作。

1 个答案:

答案 0 :(得分: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;
}