typescript enum 能合并吗?

2020-04-06 18:09:25 +08:00
 xiaoming1992

segmentfault - typescript 里怎么合并枚举 enum国内有这个问题, 但目前没有答案, stackoverflow 搜关键字没搜到想要的...

enum Vertical {
	Up = "up",
    Down = "down"
}

enum Horizon {
	Left = "left",
    Right = "right"
}

// 如果 enum 的值是默认的从零自增的数字
// 那合并确实会出错, Vertical.Up = 0 = Horizon.Left
// 可是这儿是字符, 且我手动管理不让其冲突, ts 也不允许吗?
const Dir = Vertical | Horizon
4383 次点击
所在节点    TypeScript
6 条回复
noe132
2020-04-06 20:48:54 +08:00
类型和值不要弄混了。

type Dir = Vertical | Horizon

let value: Dir
value = Vertical.Up
value = Horizon.Left
himself65
2020-04-06 22:29:38 +08:00
实际上 enum 就是个 object,楼上说的不完全对

const Dir = Vertical | Horizon 相当于两个 object 取或

Enum 也只有类型上的取并集,没有值意义上的取并集

```
enum A {
a = 1,
b = 2
}

enum B {
c = 3,
d = 4
}

/*
(function (A) {
A[A["a"] = 1] = "a";
A[A["b"] = 2] = "b";
})(A || (A = {}));
var B;
(function (B) {
B[B["c"] = 3] = "c";
B[B["d"] = 4] = "d";
})(B || (B = {}));
*/

type C = A | B

let c: C = A.a // correct
c = C.a // invalid
```
xiaoming1992
2020-04-07 07:51:05 +08:00
@noe132 大哥,我知道值能这么搞,问题是我需要枚举也能支持啊。。。

@himself65 我并不是需要“或”这么一个操作,只是希望枚举能支持合并啊

```
enum A {
a = 1,
b = 2
}

enum B {
c = 3,
d = 4
}

我就希望能有一个操作能将两者合并,得到另一个枚举类型 C

enum C {
a = 1,
b = 2,
c = 3,
d = 4,
}
```
noe132
2020-04-07 09:43:35 +08:00
如果
enum A {
a = 1
}

enum B {
a = 2
}

你希望合并后是什么结果?

明显怎样合并都是类型不安全的。

就算不考虑 typescript

var A = { a: 1 }
var B = { a: 2 }

var C = { ...A, ...B }
var C = { ...B, ...A }

C 也有至少有 2 种可能的结果,而且还和顺序有关系

而且,const enum 根本就不存在有 A 这个对象,const enum 在编译时就将所有用到的地方全部替换成值了
const a = A.a 会被直接编译成 const a = 1

这种情况你连合并都不可能,因为根本就没有 A 这个对象。A 只是代表一个符号。

如果你想合并,直接用对象字面量就挺好的
const A = { a: 1 } as const
const B = { b: 2 } as const
const C = { ...A, ...B }
这样 C 就是你要的东西了,而且类型 typescript 也能推导出来。
xiaoming1992
2020-04-07 10:22:14 +08:00
@noe132 直接用对象字面量倒是个好办法

```
enum A {
a = 1
}

enum B {
a = 2
}

你希望合并后是什么结果?

报错
```
noe132
2020-04-07 14:36:16 +08:00
去提 issue 或者 pr 吧。我觉得你这个需求基本不会被考虑。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/659883

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX