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
1
noe132 2020-04-06 20:48:54 +08:00 1
类型和值不要弄混了。
type Dir = Vertical | Horizon let value: Dir value = Vertical.Up value = Horizon.Left |
2
himself65 2020-04-06 22:29:38 +08:00 1
实际上 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 ``` |
3
xiaoming1992 OP |
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 也能推导出来。 |
5
xiaoming1992 OP |
6
noe132 2020-04-07 14:36:16 +08:00 via Android
去提 issue 或者 pr 吧。我觉得你这个需求基本不会被考虑。
|