在Typescript中合并文件/命名空间/模块?

时间:2018-04-09 12:55:36

标签: typescript

我觉得这有一个简单的答案,但我无法理解有关合并多个文件的文档。

// a.ts
enum Color{
    RED,
    BLUE
}
// b.ts
enum Day{
    MONDAY,
    TUESDAY
}
// c.ts
import * as Types from "a, b";

console.log(Types.Color.RED, Types.Day.MONDAY);

我有多个文件中的枚举,但希望它们都可以通过一个标识符使用。显然c.ts中的逗号符号没有任何意义,那么我怎样才能实现console.log正在做的事情呢?

我玩过命名空间和模块,但还没有语法正确的东西。

1 个答案:

答案 0 :(得分:0)

嗯,你有两个选择:

可以在不同文件中合并声明,但前提是它们是纯声明文件,而不是模块。

你可以这样做:

a.d.ts:

declare enum A {
    a = 0,
    b,
}

b.d.ts:

declare enum A {
    c,
    d
}

test.ts:

const a = A.a;
const c = A.c;

这是因为A枚举属于全局范围,因此TypeScript会合并它们。它也适用于命名空间。

但是,当您将其中一个文件转换为模块时,它将停止工作。

如果你在b.d.ts结束时这样做:

export = A;

现在该文件正在导出某些东西:它变成了一个模块,在该文件中声明的所有内容都属于该模块的范围。

现在,在test.ts中,行const c = A.c将指示错误。全局枚举A只有两个值:ab

因此,如果您的枚举是在模块文件中声明(导出某些内容),那么您就无法混合这些声明。

在这种情况下,您应该将定义文件添加到项目(d.ts)文件中,并在其中定义枚举,然后它将全局可用。事实上,这将是最好的方法,因此修改该枚举只有一点。合并不同文件中的声明对命名空间很有用,但对于枚举来说真的没有用处:

A-enum.d.ts:

 declare enum A {
     a = 0,
     b,
     c,
     d,
 }