提问人:Lucio Flores 提问时间:12/17/2022 更新时间:12/17/2022 访问量:279
将符号从一个文件/命名空间导入到另一个具有相同命名空间的文件
Import symbols from one file/namespace into another file with the same namespace
问:
我有一个带有多个源文件的 Typescript 模块,每个源文件都在同一个命名空间“aaa”中定义符号。我需要将一个符号从一个文件导入到另一个文件:
a.ts:
export namespace aaa {
export const A = 1;
}
b.ts:不起作用
export namespace aaa {
export const B = A + 1;
}
我无法导入 .我最多可以做到:aaa.A
b.ts
b.ts:作品
import { aaa as bbb } from "./a";
export namespace aaa {
export const B = bbb.A + 1;
}
我觉得有更好的方法可以做到这一点。我真正想做的是让编译器理解 a.ts 中的 aaa 命名空间与 b.ts 中的命名空间相同。我应该能够从内部解决.A
b.ts
答:
答
以下来自有关多文件命名空间的文档。
...即使这些文件是分开的,它们也可以各自贡献同一个命名空间,并且可以像在一个位置定义一样使用它们。由于文件之间存在依赖关系,因此我们将添加引用标记以告知编译器文件之间的关系。我们的测试代码在其他方面保持不变。
因此,我们需要应用一个引用标记,以便让编译器知道这取决于首先知道的内容。b.ts
a.ts
b.ts
:
/// <reference path="a.ts" />
namespace aaa {
export const B = A + 1;
}
注意怎么没有!这是故意的,这是因为这会污染全球范围。export
aaa
你不能将引用标签与导出的命名空间一起使用,因为关键字的存在本身就是一个模块,而一个模块将添加创建它自己的作用域,所以如果它存在,那么这两个现在的作用域是不同的。export
aaa
有一些方法可以在不污染你的全球范围的情况下去做,(你已经发现了这种方式)。
不要使用命名空间和模块
TypeScript 文档不建议同时使用模块和命名空间。在现代 JS/TS 之前,命名空间一直是进行逻辑命名的旧方法,以防止名称冲突。从那以后,模块就接管了这个角色,并在一个文件中同时使用这两个角色......头痛。
还值得注意的是,对于 Node.js 应用程序,模块是默认的,我们建议在现代代码中使用模块而不是命名空间。
如果只是为了简单地组织代码,那么它有一个主题:不必要的命名空间
TypeScript 中模块的一个关键特性是,两个不同的模块永远不会为同一个作用域贡献名称。由于模块的使用者决定为其分配什么名称,因此无需主动将导出的符号包装在命名空间中。
在这个问题的回答中,也有一个很好的描述:如何将命名空间与 TypeScript 外部模块一起使用?这将更好地解释这一切,强烈推荐阅读。
评论