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

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

TypeScript强调MyNamespace,并抱怨:

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

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

declare var MyNamespace: any;

MyNamespace = MyNamespace || {};

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

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


当前回答

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

以下是我所做的:

(window as any).MyNamespace

其他回答

从TypeScript ^3.4.3开始,这个解决方案不再有效

还是……

你可以输入:

window['MyNamespace']

你不会得到一个编译错误它和输入window。mynamespace是一样的。

使用

window["MyNamespace"] = window["MyNamespace"] || {};

应该是正确的,因为它使用了一个字符串属性,但如果你真的想有一个分离的窗口和组织你的代码,你可以扩展窗口对象:

interface MyNamespacedWindow extends Window {
    MyNamespace: object;
}

declare var window: MyNamespacedWindow;

全局变量是“邪恶的”:)我认为拥有可移植性的最好方法是:

首先导出接口:(例如,./custom.window.ts)

export interface CustomWindow extends Window {
    customAttribute: any;
}

第二,导入

import {CustomWindow} from './custom.window.ts';

第三,使用CustomWindow强制转换全局变量窗口:

declare let window: CustomWindow;

通过这种方式,你也不会在不同的IDE中有红线,如果你使用它与窗口对象的存在属性,所以在最后尝试:

window.customAttribute = 'works';
window.location.href = '/works';

用TypeScript 2.4测试。X和最新!

完整和简短的回答

1-在tsconfig.json中添加typeRoots属性:

{
  "compilerOptions": {
    ...
    "typeRoots": ["src/@types", "node_modules/@types"]
    ...
  }
}

2-扩展窗口类型

// file: src/@types/global.d.ts

declare global {
    interface Window { customProperty: <type>; }
}

首先,您需要在当前 范围。因为TypeScript想知道对象的类型 对象。由于窗口对象是在其他地方定义的,所以不能重新定义它。

但你可以按以下方式申报:

declare var window: any;

这将不会重新定义窗口对象,也不会创建另一个名为window的变量。这意味着窗口是在其他地方定义的,您只是在当前作用域中引用它。

然后你可以通过以下方式引用你的MyNamespace对象:

window.MyNamespace

或者你可以在窗口对象上简单地设置新属性:

window.MyNamespace = MyObject

现在TypeScript不会抱怨了。