typescript - 为什么不支持可派生枚举?
问题描述
如何创建作为另一个枚举子集的枚举?
在某些情况下,支持一个枚举是方便的,它是另一个名称不同的枚举的子集,在运行时派生相同的值。
有没有更好的方法来支持这种情况?
打字稿
enum Original {
value = "value",
other = "other"
}
enum Derived {
value = Original.value
}
const test: Original = Derived.value;
生成的 JavaScript
"use strict";
var Original;
(function (Original) {
Original["value"] = "value";
Original["other"] = "other";
})(Original || (Original = {}));
var Derived;
(function (Derived) {
Derived["value"] = "value";
})(Derived || (Derived = {}));
const test = Derived.value;
如果不是将静态常量分配给 Derived 枚举,而是在运行时从 Original 派生值,那将很方便。
可能性:
- 替换:由于枚举是从现有枚举派生的,因此编译可以将派生值替换为原始值。即不需要在 JavaScript 中创建单独的 Derived 对象。
替换示例:
"use strict";
var Original;
(function (Original) {
Original["value"] = "value";
Original["other"] = "other";
})(Original || (Original = {}));
const test = Original.value;
解决方案
最简单的方法似乎是定义enum
使用联合的子类型:
enum Original {
foo = "foo",
bar = "bar",
baz = "baz",
}
type Derived = Original.foo | Original.bar;
这不允许您编写Derived.foo
. 如果有必要,您可以编写一个辅助函数来创建表示枚举子类型的对象:
type ValueOf<T> = T[keyof T];
function enumSubtype<T, K extends keyof T>(e: T, keys: K[]): Pick<T, K> {
const out = {} as Pick<T, K>;
for (let k of keys) {
out[k] = e[k];
}
return out;
}
const Derived = enumSubtype(Original, ['foo', 'bar']);
type Derived = ValueOf<typeof Derived>;
类型Derived
是Original.foo | Original.bar
。
推荐阅读
- reactjs - 刷新令牌JWT后使用redux函数
- kubernetes - K8S - 使用 CronJob 的“最后计划”作为容器命令中的参数
- charts - 如何分隔谷歌图表面积图中的日期
- mongodb - 过滤器键不在集合中
- python - Python 上的循环导入
- android - Android Studio:当我尝试添加 RecyclerView 时显示一个警告框
- scala - 如何在不使用 SQL 插入的情况下向 Scala 中的 DataFrame 添加/追加新行?
- android - 如何将数据从后台 android 服务传递到 react-native
- java - 在 Java 中实现枚举时的最佳实践是什么?
- python - 使用 Selenium 仅通过其 XPath 的一部分查找元素