导入时打字稿 class 和名称脚本层次结构

typescript class and namescript hierarchy when do importing

我有一个关于名称冲突的问题,但没有导致任何错误,而且似乎将 pre usual 导出到外部范围。最好的展示方式是在这个简化代码中;

Endpoints.model.ts

namespace Endpoints {
 export class FruitWorld {
  apple: string;
  banana: string;
  seller: string;
  sellerId: string;
  get produceDate() {
   ...
  }
 }
}
export class FruitWorld extended Endpoints.FruitWorld {
 Seller: string;
 SellerId: string;
 get ProduceDate() {
  ...
 }
 constructor(...init: Partial<Endpoints.FruitWorld>[]) {
  super();
  init.map(data => {
   delete data.Apple;
   delete data.Banana;
   Object.assign(this, data);
  }
 }
}
export namespace FruitWorld {
 // Some overwrite function 
 // extended functionalities
}

app.ts

import { FruitWorld } "./Endpoints.model";

这是令人困惑的部分,这里导入了 FruitWorld 中的哪一个?据我所知,它是 class 被导入的。

我读了这个 stackover question and ,但他们并没有真正触及如果我们有一个 class 和一个命名空间共享相同的名称,并且存在于同一个文件中。哪个出口?

Class export will be overridden by a namespace 如果命名空间非空:

export class Foo { }

export namespace Foo {
    let bar;
}

因此它在编译器输出中持续存在:

var Foo = /** @class */ (function () {
    function Foo() {
    }
    return Foo;
}());
exports.Foo = Foo;
(function (Foo) {
    var bar;
})(Foo = exports.Foo || (exports.Foo = {}));
exports.Foo = Foo;

并且class导出won't be overridden by a namespace如果它是空的:

export class Foo { }

export namespace Foo {
    // let bar;
}

因此它已从编译器输出中删除:

var Foo = /** @class */ (function () {
    function Foo() {
    }
    return Foo;
}());
exports.Foo = Foo;