全局范围的扩充只能直接嵌套

全局范围的扩充只能直接嵌套

Augmentations for global scope can only be directly nested

当我们尝试修改外部模块外部的全局范围时,会出现错误“全局范围的扩充只能直接嵌套在外部模块或环境模块声明中”。

要解决该错误,请添加export {}使文件成为外部模块。

下面是错误如何发生的示例。

类型.d.ts
// ⛔️ Error: Augmentations for the global // scope can only be directly nested in external // modules or ambient module declarations.ts(2669) declare global { interface Window { example: any; } }

我正在尝试修改外部模块之外的全局范围(窗口)。

添加导出{}语句使文件成为外部模块

要解决该错误,请添加一行export {}以使该文件成为外部模块。

类型.d.ts
// ✅ Works now export {}; // 👈️ add this declare global { interface Window { example: any; } }

import外部模块是包含or语句的文件export

如果您在文件中的任何地方使用importor语句,它就成为一个模块。export

在第一个代码示例中,types.d.ts文件不包含importor
export语句,因此发生了错误。

错误消息意味着我们只能扩大global外部模块或环境模块声明中的范围。

环境模块声明

错误消息的第二部分指出“或环境模块声明”

这是环境模块的示例

uuid.ts
declare module 'uuid' { export function v4(): string; }

环境模块旨在为没有@types/module-name可用包的第三方模块和不是用 TypeScript 编写的模块添加类型。

换句话说,它们用于为 JavaScript 代码添加 TypeScript 类型,因此该包可以集成到您的 TS 代码库中。

上面的环境模块uuid.ts声明了一个名为 named 的模块的类型,uuid并声明该模块包含一个名为 named 的函数v4,该函数的
返回类型string.

即使uuid包是用 JavaScript 编写的并且没有
@types/uuid包,我现在也可以导入模块并使用v4()
函数并将其返回类型设置为
string.

索引.ts
import * as uuid from 'uuid'; // 👇️ function v4(): string const result = uuid.v4();

这是 TypeScript 中环境模块的用例。

错误消息“Augmentations for the global scope can only be directly nested in external modules or ambient module declarations”意味着我们只能更改全局范围:

  1. 包含一个import或一个export语句的文件(外部模块)。
  2. 环境模块——描述库形状的模块,不是用 TypeScript 编写的。

我还写了一篇关于
如何从另一个文件导入值的详细指南。

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: