在TypeScript中创建一个全局变量

14 浏览
0 Comments

在TypeScript中创建一个全局变量

在JavaScript中,我可以这样做:

 something = 'testing';

然后在另一个文件中:

 if (something === 'testing')

然后它将被定义(只要以正确的顺序被调用)。

我似乎无法找出如何在TypeScript中实现这一点。

这是我尝试过的。

在一个.d.ts文件中:

interface Window { something: string; }

然后在我的main.ts文件中:

 window.something = 'testing';

然后在另一个文件中:

 if (window.something  === 'testing')

这样也是可以的。但我想要的是能够去掉其中的“window.”部分,只需让我的“something”是全局的。在TypeScript中有没有这样做的方法?

(如果有人感兴趣,我真的正在为我的应用程序设置日志记录。我希望能够从任何文件中调用log.Debug而不必导入和创建对象。)

admin 更改状态以发布 2023年5月24日
0
0 Comments

.d.ts 定义文件中

type MyGlobalFunctionType = (name: string) => void

如果您在浏览器中工作,您需要在浏览器的 window 上下文中添加成员:

interface Window {
  myGlobalFunction: MyGlobalFunctionType
}

对于 NodeJS,也是同样的思路:

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");

0
0 Comments

globalThis 是未来。

首先,TypeScript 文件有两种作用域:

全局作用域

如果你的文件没有任何 importexport,这个文件将在全局作用域中执行,其中所有声明都在该文件外部可见。

因此,我们可以像这样创建全局变量:

// xx.d.ts
declare var age: number
// or 
// xx.ts
// with or without declare keyword
var age: number
// other.ts
globalThis.age = 18 // no error

所有的魔法都来自 var。用 letconst 替换 var 是行不通的。

模块作用域

如果你的文件有任何 importexport,则该文件将在其自己的作用域内执行,我们需要通过 声明合并 来扩展全局作用域。

// xx[.d].ts
declare global {
  var age: number;
}
// other.ts
globalThis.age = 18 // no error

更多关于模块的内容可以在官方文档中查看

0