首页 > 解决方案 > 为什么不支持可派生枚举?

问题描述

如何创建作为另一个枚举子集的枚举?

在某些情况下,支持一个枚举是方便的,它是另一个名称不同的枚举的子集,在运行时派生相同的值。

有没有更好的方法来支持这种情况?

打字稿

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 派生值,那将很方便。

可能性:

替换示例:

"use strict";
var Original;
(function (Original) {
    Original["value"] = "value";
    Original["other"] = "other";
})(Original || (Original = {}));

const test = Original.value;

标签: typescript

解决方案


最简单的方法似乎是定义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>;

类型DerivedOriginal.foo | Original.bar

游乐场链接


推荐阅读