我有一个node.js应用程序,它将一些配置信息附加到global
对象:
global.myConfig = {
a: 1,
b: 2
}
TypeScript编译器不喜欢这样,因为Global
类型没有名为myConfig
的对象:
TS2339:类型“Global”上不存在属性“myConfig”。
我不想这么做:
global['myConfig'] = { ... }
我如何扩展Global
类型以包含myConfig
,或者只是让TypeScript闭嘴并相信我?
我不想修改node.d.ts
中的声明,我看到SO post并尝试了以下操作:
declare module NodeJS {
interface Global {
myConfig: any
}
}
作为扩展现有Global
接口的一种方式,但似乎没有任何效果。
9条答案
按热度按时间kr98yfug1#
从
node@16
开始,NodeJS.Global
接口has been removed支持globalThis
。您可以在模块文件中将新的全局变量声明为:
在非模块文件(没有顶级导入/导出)中为:
重要提示:变量必须声明为
var
。let
和const
变量不会显示在globalThis
上。hrirmatl2#
我看到这个如此职位,并尝试这样:
您可能有类似
vendor.d.ts
的代码:你的文件需要清除任何根级别
import
或exports
。这将把文件变成一个 * 模块 *,并断开它与 * 全局类型声明命名空间 * 的连接。更多信息:https://basarat.gitbooks.io/typescript/content/docs/project/modules.html
vql8enpb3#
为了避免Typescript声明类似于以下内容:
TS2339:类型"Global"上不存在属性"myConfig"。
我建议定义自定义类型。我在我的项目中的
src/types/custom.d.ts
文件下这样做:然后,我确保
tsconfig.json
文件中的Typescript考虑了这些内容:现在您可以安全地使用自定义属性了:
dgsult0t4#
将下面的文件放入项目的根目录中是有效的。
global.d.ts
我们使用
"@types/node": "^7.0.18"
和TypeScriptVersion 2.3.4
。我们的tsconfig.json文件如下所示:oipij1gg5#
使用“namespace”而不是“module "声明自定义TypeScript
如果你使用上面的任何一个答案,并且正在使用一个新版本的Typescript,你会得到一个关于使用**“module”的唠叨。你应该考虑命名空间。
为了满足这里的需求,实际上需要的不仅仅是扩展Global接口,如果希望从“globalThis”**上下文直接访问该类型,还需要创建一个常量。
**注意:当OP询问对象文字时,过程与您在下面看到的相同。您只需根据需要定义接口,然后将“debug:“更改为myConfig或任何您想要的类型,而不是将“Debug”**类型作为函数。
如何使用上述内容
在这个例子中,为了完整性,我们定义了一个全局变量,这样我们就可以记录一个简单的调试消息。下面是我们如何将这个方法绑定到我们的全局上下文。
我们也可以直接调用全局调试方法:
bprjcwpo6#
唯一对我有效的是:
然后在其他文件中使用它
kfgdxczn7#
对我有效的是:
唯一的缺点是,当使用它时,您将不得不关闭eslint规则
@typescript-eslint/no-namespace
。为了完整起见,下面是我的
tsconfig.json
:dvtswwa38#
复制another post的答案:
这就是未来。
l7mqbcuq9#
我可以同时获得类型检查和代码智能。
但是接口
Global
指向global.GLOBAL
。你能得到正确的类型检查,是因为:
但是使用
global.property
并不能获得更好的代码智能,除非使用global.GLOBAL.property
。因此,您需要定义全局变量
global
和扩展接口Global
:现在,您可以在键入
global.
时获得property
智能