我正在尝试在TypeScript中使用globalThis
,我想就如何以更好的方式编写它提供一些建议.
当前的实现是这样的:
创建一个文件类型/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 =
表达式
2021 年 10 月更新
适用于 TypeScript 4.3+
错误
元素隐式具有
any
类型,因为类型typeof globalThis
没有索引签名。 TS(7017(
溶液
declare global {
function myFunction(): boolean;
var myVariable: number;
}
globalThis.myFunction = () => true;
globalThis.myVariable = 42;
- 重要说明:此解决方案仅通过声明带有
var
变量(不要使用let
或const
(来工作。
背景
请参阅有关 TypeScript 问题 30139 的讨论。
传统上,在 Node.js 上下文中指定 TypeScript 声明块的方法如下:
// Does not work as of October 2021 (TypeScript 4.3+)
declare global {
module NodeJS {
interface Global {
myFunction(): boolean;
myVariable: number;
}
}
}
tsconfig.json: noImplicitAny
请注意,如果将 TypeScript 设置noImplicitAny
设置为false
,则会禁止显示此错误。建议启用noImplicitAny
以便更好地进行类型检查。
我的回答是基于爱德华·卡萨诺瓦(Edward Casanova(的回答。我正要编辑它,但对我有用的代码仍然存在很多差异,而且我现在可以提供有关此的一些其他信息。
这是基于TypeScript 4.3.5
// typings/globals.d.ts (depending on your tsconfig.json)
export {}
interface Person {
name: string
}
declare global {
var someString: string
var globalPerson: Person
}
如果没有至少一个export
(或import
(关键字,这不起作用。这会将此文件转换为 ES 模块,这是工作所必需的。您可以导出任何语句或添加空export {}
。
上面的代码为以下句柄添加了类型:
someString
window.someString
globalThis.someString
globalPerson.name
window.globalPerson.name
globalThis.globalPerson.name
另一方面,以下情况是可能的,但结果不同:
export {}
declare global {
let someLetString: string
const someConstString: string
}
这仅添加以下句柄的类型:
someLetString
someConstString
正如预期的那样,您无法为someConstString
分配任何值。这对于某些将功能添加到全局范围而不是导出它的旧 JS 库可能很有用。在这种情况下,库仍然可以为const
赋值,因为它只是一个类型,而不是一个真正的const
。此const
只有 TypeScript 代码知道。但请注意,let
和const
不会向全局对象添加属性window
和globalThis
。所以,毕竟var
可能是更好的选择。
使用其他答案的组合,这是最终对我有用的方法。
在 TS 文件的顶部(或在全局类型文件中(:
declare module globalThis {
let myObj: { foo: string };
}
globalThis.myObj = { foo: 'bar' };
您可以在打字稿中使用声明合并来实现此目的。
在global.d.ts
文件中:
export declare global {
interface Window {
// add you custom properties and methods
foo: string
}
}
现在,您可以在没有打字稿警告的情况下使用Window.foo
。
我在 dev.to 上写了一个关于这个的迷你博客
我最终得到了以下解决方案 在全球.d.ts
interface Window {
foo: string
}
declare let foo: Window["foo"];
并在另一个文件中使用它,例如
window.foo = "The value of foo">
TypeScript 3.4 引入了对 ECMAScript 新globalThis
的类型检查支持。
var x = 1
const y = 2
let z = 3
globalThis.x // ok
globalThis.y // should error, no property 'y'
globalThis.z // should error, no property 'z'
globalThis['x'] // ok
globalThis['y'] // should error, no property 'y'
globalThis['z'] // should error, no property 'z'
globalThis.Float64Array // ok
globalThis.Infinity // ok
declare let test1: (typeof globalThis)['x'] // ok
declare let test2: (typeof globalThis)['y'] // error
declare let test3: (typeof globalThis)['z'] // error
declare let themAll: keyof typeof globalThis
您可以在文档中准备更多相关信息。
找到了一种方法。也许是一个不错的解决方法
在项目根目录的"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 var 是保存other_var_value或对象或 功能
const foo = 'value of foo';
(global as any).foo;
为我工作
这就是使用typescript
版本4.5.4
对我有用的,
- 使用所需类型创建新的
.d.ts
文件:
export declare global { var foo: string; var goo: string; }
- 将此文件添加到
tsconfig.json
文件(使用files
属性(