时间:2016-07-29 09:50:12

标签: typescript module

有一段时间我一直试图从我在一个地方写的一个小库中导出类。我希望每个班级都不知道如何向外界提供这些课程,但到目前为止我无法实现这一目标。

我们假设我已经上课Foo

// lib/foo.ts
export class Foo {}

和班级Bar

// lib/bar.ts
export class Bar {}

现在我想让那些通过MyModule命名空间使用包的人可以使用它们,这就是它变得棘手的地方。我不知道如何从在类本身之外的其他地方定义的命名空间中导出现有的类。

显然,这不起作用,因为它不是有效的TypeScript:

// api.ts
import { Foo } from "./lib/foo";
import { Bar } from "./lib/bar";

export namespace MyModule {
    export Foo;

    export namespace MySubModule {
        export Bar;
    }
}

我找到了两个可能的解决方案,但两者都有其缺点。我可以定义一个变量并将类分配给它:

// api.ts
import { Foo as MyFoo } from "./lib/foo";
import { Bar as MyBar } from "./lib/bar";

export namespace MyModule {
    export const Foo = MyFoo;

    export namespace MySubModule {
        export const Bar = MyBar;
    }
}

这实际上允许我从new MyModule.MySubModule.Bar之类的外部位置创建类的实例,但是不会让我将它们用作类型,因为

let myBarInstance: MyModule.MySubModule.Bar;

会抛出一个说明

的TypeScript错误
  

模块“path / to / module / api”.MySubModule没有导出成员'Bar'

另一方面,我尝试使用export type Bar = MyBar代替const,而这在说

时有效
let myBarInstance: MyModule.MySubModule.Bar

另一方面,我自然无法实例化MyModule.MySubModule.Bar,因为它只是一个类型别名。

对于Foo类,所有这些都是一样的。

有没有人对此有任何经验,我是否可能忽略了TypeScript提供的其他一些导出功能?

1 个答案:

答案 0 :(得分:3)

所以来自TypeScript团队的Ryan Cavanaugh在他们的GitHub上已经to answer my question了。

这实际上非常简单:只需结合我提出的两种方法,你就可以了:

Maven