我通过显式设置窗口上的属性为我的对象设置全局名称空间。

window.MyNamespace = window.MyNamespace || {};

TypeScript强调MyNamespace,并抱怨:

属性“MyNamespace”在类型为“window”的值上不存在 任何“

我可以通过将MyNamespace声明为环境变量并删除窗口显式来使代码工作,但我不想这样做。

declare var MyNamespace: any;

MyNamespace = MyNamespace || {};

我如何保持窗口在那里,让TypeScript满意?

作为旁注,我发现特别有趣的是,TypeScript抱怨,因为它告诉我,窗口的类型是any,它肯定可以包含任何东西。


当前回答

创建一个扩展Window的自定义界面,并将自定义属性添加为可选属性。

然后,让customWindow使用自定义接口,但值与原始窗口相同。

它与TypeScript 3.1.3一起工作。

interface ICustomWindow extends Window {
  MyNamespace?: any
}

const customWindow:ICustomWindow = window;

customWindow.MyNamespace = customWindow.MyNamespace {}

其他回答

下面是如何做到这一点,如果你使用的是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 || {};

TypeScript阻止在没有指定具有所需属性或类型的情况下访问对象 已经分配给了any,所以你可以使用可选的链接:

window?.MyNamespace =  'value'

使用slvelte还是TSX?其他的答案都对我不起作用。

以下是我所做的:

(window as any).MyNamespace

其他大多数答案都不完美。

其中一些只是为了显示而抑制了类型推断。 其他一些只关心全局变量作为名称空间,而不关心接口/类

今天早上我也遇到了一个类似的问题。我在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的属性)中。

对于那些想要在窗口对象上设置计算或动态属性的人,你会发现使用declare global方法是不可能的。来阐明这个用例

window[DynamicObject.key] // Element implicitly has an 'any' type because type Window has no index signature

你可以尝试这样做

declare global {
  interface Window {
    [DyanmicObject.key]: string; // error RIP
  }
}

但上面的操作会出错。这是因为在TypeScript中,接口不能很好地使用计算属性,并且会抛出类似于

A computed property name in an interface must directly refer to a built-in symbol

为了解决这个问题,你可以按照建议将窗口转换为<any>

(window as any)[DynamicObject.key]