在Typescript中使用globalThis

在Typescript中使用globalThis,typescript,Typescript,我正在尝试在Typescript中使用globalThis,我想了解一些关于如何更好地编写它的建议。 当前的实现如下所示: 创建一个文件types/global.d.ts并添加到内部 interface Global { foo: string } declare let foo: Global["foo"]; 在tsconfig.json中添加 "files": [ "types/global.d.ts" ] 然后,为了设置foo的值,使用 (globalThis as any

我正在尝试在Typescript中使用globalThis,我想了解一些关于如何更好地编写它的建议。
当前的实现如下所示:

创建一个文件types/global.d.ts并添加到内部

interface Global {
   foo: string
}

declare let foo: Global["foo"];
tsconfig.json中添加

"files": [
  "types/global.d.ts"
]
然后,为了设置
foo
的值,使用

(globalThis as any).foo = "The value of foo"
我不喜欢这种方法,首先是需要的样板文件(但我认为这是不可避免的),其次是
(globalThis as any).foo=
表达式可以在typescript中使用

在您的
global.d.ts
文件中:

导出声明全局{
界面窗口{
//添加自定义属性和方法
foo:string
}
}
现在,您可以使用
Window.foo
,而无需键入脚本警告


我在

上写了一篇关于这一点的微博,最后我提出了以下解决方案 在global.d.ts中

interface Window {
  foo: string
}

declare let foo: Window["foo"];
并在另一个文件中使用,如

window.foo=“foo的值”


TypeScript 3.4引入了对类型检查的支持,ECMAScript的新
globalThis

var x=1
常数y=2
设z=3
globalThis.x//ok
globalThis.y//应为错误,没有属性“y”
globalThis.z//应为错误,没有属性“z”
globalThis['x']//好的
globalThis['y']//应为错误,没有属性“y”
globalThis['z']//应为错误,没有属性“z”
globalThis.Float64Array//ok
全球这是无限//好的
声明let test1:(typeof globalThis)['x']//确定
声明let test2:(typeof globalThis)['y']//错误
声明let test3:(typeof globalThis)['z']//错误
声明let themAll:keyof typeof globalThis

您可以在

中结合其他答案准备更多关于它的信息,以下是最终对我有效的答案

在TS文件的顶部(或在全局打字文件中):


找到了一条路。也许是个不错的解决办法

在项目根目录下的“global.d.ts”文件中,编写以下内容

declare global {    
    var [propertyYouWantToAdd]: any; or typeof "anything you want. Perhaps import a class from a module";

//Make sure you use var instead of let or const, as it attaches to the global object.     
}

以下是文档中的选项,但如果您找到替代选项

window.foo = 'value of foo' 
那么一个简单的解决方案就是

打字

other_var_name是保存other_var_值或对象的var 作用


为我工作

我的第一个问题是Globalt的使用,以及是否有不需要它的可用解决方案。foo可以在局部范围或缩小范围内引用,而不是使用全局对象吗?@AustinMehmet在这种特定情况下,需要使用globalThis<代码>窗口对象仍然可以为我工作。但是需要一个全局的
foo
也没有办法使用任何更高阶的包装来避免全局?谢谢你的回答。我在
declare global
上得到一个错误,说
TS2669:全局范围的扩展只能直接嵌套在外部模块或环境模块声明中。
编辑以在行的开头添加导出关键字我还在项目根目录下有
global.d.ts
文件(与tsconfig.json目录相同)我不知道。也许我错过了什么。现在我得到了
TS2668:“导出”修饰符不能应用于环境模块和模块增强,因为它们总是可见的。
您使用的是什么版本的typescript?typescript编译器的发展方向是什么:
tsc--v
npx-tsc--v
globalThis这似乎是未来,但我还没有找到一种方法来使用typescript通过类型属性扩展globalThis。对于窗口接口和窗口对象,我可以这样做,但对于全局对象,我仍在寻找解决方案。如果要为foo属性指定自定义类型,您知道如何使用相同的方法吗?由于无法将自定义类型导入到global.d.ts文件中,我仍在寻找一种解决方案来声明Window/global此接口的扩展名,该接口的属性为自定义复杂类型。我不太了解这个问题。但这可能是一个可行的解决方案吗?谢谢,这在TS 4.0.5中对我有效,而所有其他答案都没有!声明名称与内置全局标识符“globalThis”冲突
declare global {    
    var [propertyYouWantToAdd]: any; or typeof "anything you want. Perhaps import a class from a module";

//Make sure you use var instead of let or const, as it attaches to the global object.     
}
window.foo = 'value of foo' 
const foo = 'value of foo';
(global as any).foo;