TypeScript同名类与命名空间导出疑问:导入的是哪一个?
关于TypeScript中同名类与命名空间导出的优先级问题
你的观察完全正确——当你在app.ts中导入FruitWorld时,首先拿到的是那个类,但同时你也能访问同名命名空间里的内容,这是因为TypeScript的声明合并机制在起作用。
让我拆解一下背后的逻辑:
- 当你在同一个模块里导出同名的类和命名空间时,TypeScript会自动将它们合并成一个单一的导出实体。类作为核心的构造函数存在,而命名空间中定义的所有成员,都会被挂载到这个类的构造函数对象上(相当于给类添加了静态成员)。
- 举个实际的例子,如果你的
FruitWorld命名空间里有这样的内容:
那么在export namespace FruitWorld { export function fetchSellerDetails() { return "Fresh Produce Co."; } }app.ts里你可以同时做这两件事:import { FruitWorld } from "./Endpoints.model"; // 用类创建实例 const myFruitWorld = new FruitWorld({ seller: "Local Market" }); // 访问命名空间里的方法(作为类的静态方法) const sellerName = FruitWorld.fetchSellerDetails();
需要注意的是,这里的合并只针对顶层导出的同名实体——你内部Endpoints命名空间里的FruitWorld类是完全独立的,和导出的FruitWorld没有直接关联,只是你的导出类继承了它而已。
总结一下:
- 你导入的
FruitWorld不是单纯的类或单纯的命名空间,而是两者合并后的产物。 - 你可以用它实例化对象(类的能力),也可以直接访问命名空间里定义的扩展功能(静态成员的形式)。
内容的提问来源于stack exchange,提问作者roger
相关产品推荐
相关产品推荐

