在使用 TypeScript 进行开发时,我们可能会遇到这样一种错误:“Ambient modules 必须处于全局命名空间内”。这种错误一般是由于全局命名空间的使用不当导致的,本文将介绍如何解决这种错误。
什么是全局命名空间
在 TypeScript 中,全局命名空间是指在全局作用域下定义的命名空间。在全局命名空间中定义的变量、函数等都可以被其他模块使用。
例如,我们可以在全局命名空间中定义一个变量:
// 定义全局变量 declare const myVar: string; // 使用全局变量 console.log(myVar);
在上面的代码中,我们使用 declare
关键字定义了一个全局变量 myVar
,然后在代码中使用了这个变量。
Ambient modules 必须处于全局命名空间内
当我们在 TypeScript 中定义一个模块时,如果这个模块是一个 ambient module(即模块定义中包含 declare module 'xxx'
),那么这个模块必须处于全局命名空间内。
例如,以下代码会出现 “Ambient modules 必须处于全局命名空间内” 的编译错误:
namespace MyModule { declare module 'my-module' { export function foo(): void; } }
这段代码中,我们在命名空间 MyModule
中定义了一个 ambient module,但是这个命名空间并不是全局命名空间,所以编译时会出现错误。
解决方法
要解决这个错误,我们需要将 ambient module 放在全局命名空间内。有两种方法可以实现这个目的。
方法一:使用 global 关键字
可以使用 global
关键字将 ambient module 放在全局命名空间内。例如:
declare global { module 'my-module' { export function foo(): void; } }
这段代码中,我们使用 declare global
关键字将 ambient module 放在了全局命名空间内。
方法二:使用 import
另一种方法是使用 import
将 ambient module 引入到全局命名空间中。例如:
import { MyModule } from './my-module'; declare global { namespace MyModule { export function foo(): void; } }
这段代码中,我们首先使用 import
引入了 ./my-module
模块,然后将 MyModule
命名空间放在了全局命名空间内。
示例代码
以下是一个完整的示例代码,演示了如何解决 “Ambient modules 必须处于全局命名空间内” 错误:
// javascriptcn.com 代码示例 // 定义模块 namespace MyModule { declare module 'my-module' { export function foo(): void; } } // 方法一:使用 global 关键字 declare global { module 'my-module' { export function foo(): void; } } // 方法二:使用 import import { MyModule } from './my-module'; declare global { namespace MyModule { export function foo(): void; } }
总结
在 TypeScript 中,如果我们定义了一个 ambient module,那么它必须处于全局命名空间内。我们可以使用 declare global
关键字或者使用 import
将 ambient module 放在全局命名空间内。希望本文能够对你解决 “Ambient modules 必须处于全局命名空间内” 错误有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6561a91cd2f5e1655dbaefa2