You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:58:12