如何在TypeScript多文件中定义同一命名空间并统一导出?
解决TypeScript多文件定义同一命名空间并统一导出的问题
你遇到的警告是因为两个文件都导出了同名的aaa命名空间,使用export *会触发命名冲突。这里提供几种可行的解决方式:
方式一:显式合并后导出
在index.ts中分别导入两个文件的aaa,通过重命名避免冲突,再合并成一个对象导出,同时保留类型信息:
import { aaa as aaaFromA } from "./a"; import { aaa as aaaFromB } from "./b"; export const aaa = { ...aaaFromA, ...aaaFromB } as typeof aaaFromA & typeof aaaFromB;
这种方式简单直接,适合命名空间内都是变量、函数这类可扩展成员的场景。
方式二:拆分成员导出,再统一组合成命名空间
不在子文件中导出整个命名空间,而是单独导出成员,之后在index.ts里创建并导出完整的aaa命名空间:
a.ts:
export const a = "a";
b.ts:
export const b = "b";
index.ts:
import { a } from "./a"; import { b } from "./b"; export namespace aaa { export { a, b }; }
这种方式结构清晰,后续新增成员时,只需在对应子文件导出,再在index.ts的命名空间中引入即可。
方式三:利用模块级命名空间合并(调整子文件写法)
如果想保留子文件里的命名空间写法,可以去掉子文件的export,让命名空间在模块内部自动合并,最后在index.ts统一导出:
a.ts:
// 不export命名空间,使其成为模块内部的命名空间 namespace aaa { export const a = "a"; }
b.ts:
namespace aaa { export const b = "b"; }
index.ts:
// 导入两个文件触发命名空间合并 import "./a"; import "./b"; // 声明合并后的命名空间类型并导出 declare namespace aaa { export const a: string; export const b: string; } export { aaa };
这种方式适合需要在子文件内用命名空间组织代码的场景,但需要手动补充类型声明。
内容的提问来源于stack exchange,提问作者Lucio Flores
相关产品推荐
相关产品推荐

