在TypeScript中创建一个全局变量
在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日
在 .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");
globalThis 是未来。
首先,TypeScript 文件有两种作用域:
全局作用域
如果你的文件没有任何 import
或 export
行,这个文件将在全局作用域中执行,其中所有声明都在该文件外部可见。
因此,我们可以像这样创建全局变量:
// 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
。用let
或const
替换var
是行不通的。
模块作用域
如果你的文件有任何 import
或 export
行,则该文件将在其自己的作用域内执行,我们需要通过 声明合并 来扩展全局作用域。
// xx[.d].ts declare global { var age: number; } // other.ts globalThis.age = 18 // no error
更多关于模块的内容可以在官方文档中查看