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

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

TypeScript强调MyNamespace,并抱怨:

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

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

declare var MyNamespace: any;

MyNamespace = MyNamespace || {};

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

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


当前回答

从3.4版开始,TypeScript已经支持globalThis。参见globalThis的类型检查。

从上面的链接:

// in a global file:
var abc = 100;
// Refers to 'abc' from above.
globalThis.abc = 200;
window.abc = 300; // window object can also be used.

操场上

“全局”文件是没有任何导入/导出语句的文件。声明var abc;可以写成。d.ts。

其他回答

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

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

保存该文件。

现在最后一个变化。

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

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

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

今天我想在Angular(6)库中使用它,我花了一段时间才让它像预期的那样工作。

为了使我的库能够使用声明,我必须对声明全局对象的新属性的文件使用d.ts扩展名。

所以最后,这个文件就变成了这样:

/ path-to-angular-workspace / angular-workspace /项目/ angular-library / src / globals.d.ts

创建后,不要忘记在public_api.ts中公开它。

这对我很有帮助。

供参考(这是正确答案):

在。d里面。Ts定义文件

type MyGlobalFunctionType = (name: string) => void

如果你在浏览器中工作,你可以通过重新打开window的界面将成员添加到浏览器的窗口上下文:

interface Window {
  myGlobalFunction: MyGlobalFunctionType
}

Node.js也是这样:

declare module NodeJS {
  interface Global {
    myGlobalFunction: MyGlobalFunctionType
  }
}

现在你声明根变量(它将实际存在于window或global上):

declare const myGlobalFunction: MyGlobalFunctionType;

然后在一个普通的.ts文件中,但作为副作用导入,你实际上实现了它:

global/* or window */.myGlobalFunction = function (name: string) {
  console.log("Hey !", name);
};

最后在代码库的其他地方使用它,使用:

global/* or window */.myGlobalFunction("Kevin");

myGlobalFunction("Kevin");

要保持动态,只需使用:

(<any>window).MyNamespace

注意,这可能不适用于TSX,因为编译器可能认为<any>是TSX元素。查看与TSX兼容的类型断言的答案。