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

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

TypeScript强调MyNamespace,并抱怨:

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

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

declare var MyNamespace: any;

MyNamespace = MyNamespace || {};

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

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


当前回答

对于那些使用Angular CLI的人来说,这很简单:

文件src / polyfills.ts

declare global {
  interface Window {
    myCustomFn: () => void;
  }
}

文件my-custom-utils.ts

window.myCustomFn = function () {
  ...
};

如果你正在使用IntelliJ IDEA,你还需要在IDE中更改以下设置,然后你的新腻子才会开始:

> File
> Settings
> Languages & Frameworks
> TypeScript
> check 'Use TypeScript Service'.

其他回答

创建一个名为global.d的文件。Ts,例如/src/@types/global.d。Ts,然后定义如下接口:

interface Window {
  myLib: any
}

参考:Global .d.ts

使用create-react-app v3.3,我发现实现这一点最简单的方法是扩展自动生成的react-app-env.d.ts中的Window类型:

interface Window {
    MyNamespace: any;
}

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

[2022]:我们必须在React或Nextjs项目中扩展“window”对象。 我们可以通过下面的步骤来解决这个问题。

在src文件夹名称中创建一个文件夹作为类型。 在类型文件夹中创建一个名为index.d.ts的文件 将这段代码写在index.d.ts文件中。 出口{}; 声明全局{ 窗口{ 名称空间:任何; } } 窗口。名称空间=窗口。名称空间| | {};

保存该文件。

现在最后一个变化。

修改“tsConfig. conf”json文件。来继承节点模块类型和我们的类型。

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

我刚刚在另一个Stack Overflow问题的答案中找到了这个问题的答案。

declare global {
    interface Window { MyNamespace: any; }
}

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

基本上,您需要扩展现有的窗口界面来告诉它您的新属性。