强制枚举仅具有数值(对枚举进行类型检查)

时间:2019-09-16 08:34:59

标签: typescript

我想强制 泛型 数字枚举。我的意思是 Enum 类型应该只包含数值。下面的示例:

export type TNumberEnum<Enum> = { [key in keyof Enum]: number };

enum sample {
    AA,
    BB,
    CC = 'cc'
}

class SampleClass<CustomEnum extends TNumberEnum<CustomEnum>> {

    constructor( private value: CustomEnum ){}
    public sampleFunctin(): CustomEnum {
        return this.value;
    }
}

let a = new SampleClass<sample>( sample.CC ); // It should fail, keyof sample has string value

// valueOf and toString maybe could they cause problems?

See a demo here

我将自定义的枚举传递给 SampleClass ,但是,我希望该 Generic Enum 成为数字枚举。有可能吗?

1 个答案:

答案 0 :(得分:0)

Typescript不支持对Enum类型的类型检查。您可以修改您的类以遍历枚举元素以创建新对象。在JavaScript中,Enum基本上变成了一个对象。

例如您的示例的枚举结果

(function (sample) {
    sample[sample["AA"] = 0] = "AA";
    sample[sample["BB"] = 1] = "BB";
    sample["CC"] = "cc";
})(sample || (sample = {}));

如果执行将导致

{
  0:    "AA",
  "AA": 0,
  1:    "BB",
  "BB": 1,
  "cc": "CC",
  "CC": "cc"
}

但是,当遍历属性时,您可能无法始终识别出哪个属性是枚举键和哪个枚举值。

如果您以某种方式解决了此问题,则可以使用以下示例代码创建一个新的“枚举”

const myEnum = {}
for (let i = 0; i < keys.length; i++) {
    myEnum[i] = keys[i]
}

有效地将所有枚举值强制为数字。