我通过显式设置窗口上的属性为我的对象设置全局名称空间。
window.MyNamespace = window.MyNamespace || {};
TypeScript强调MyNamespace,并抱怨:
属性“MyNamespace”在类型为“window”的值上不存在
任何“
我可以通过将MyNamespace声明为环境变量并删除窗口显式来使代码工作,但我不想这样做。
declare var MyNamespace: any;
MyNamespace = MyNamespace || {};
我如何保持窗口在那里,让TypeScript满意?
作为旁注,我发现特别有趣的是,TypeScript抱怨,因为它告诉我,窗口的类型是any,它肯定可以包含任何东西。
其他大多数答案都不完美。
其中一些只是为了显示而抑制了类型推断。
其他一些只关心全局变量作为名称空间,而不关心接口/类
今天早上我也遇到了一个类似的问题。我在Stack Overflow上尝试了很多“解决方案”,但没有一个完全没有类型错误,并在IDE中启用触发类型跳转(WebStorm或Visual Studio Code)。
最后,从允许模块定义声明为全局变量#3180
我找到了一个合理的解决方案,为同时充当接口/类和名称空间的全局变量附加类型。
例子如下:
// typings.d.ts
declare interface Window {
myNamespace?: MyNamespace & typeof MyNamespace
}
declare interface MyNamespace {
somemethod?()
}
declare namespace MyNamespace {
// ...
}
上面的代码将命名空间MyNamespace和接口MyNamespace的类型合并到全局变量MyNamespace (window的属性)中。
下面是如何做到这一点,如果你使用的是TypeScript定义管理器!
npm install typings --global
创建输入/定制/ window.d.ts:
interface Window {
MyNamespace: any;
}
declare var window: Window;
安装自定义输入:
typings install file:typings/custom/window.d.ts --save --global
完成了!使用它!TypeScript不会再抱怨了:
window.MyNamespace = window.MyNamespace || {};