【问题标题】:Force an Enum to have just numerical values (type checks for Enum)强制枚举只有数值(枚举类型检查)
【发布时间】:2019-09-16 17:37:22
【问题描述】:

我想强制 Generic 成为 numerical enum。我的意思是 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

我将自定义 Enum 传递给 SampleClass,但是,我想要 Generic 枚举为数字枚举。有可能吗?

【问题讨论】:

  • 喜欢this? value sample 和 type sample 之间有一个difference。
  • 我不认为 Enum 直接从数字扩展而来。从string 的枚举中删除CC,编译通过并添加一些具有string 值的成员,枚举不满足number 类型。解决了。​​
  • 那么,如果我把它写出来,我的评论会成为你的答案吗?
  • @jcalz 是的,先生!

标签: typescript


【解决方案1】:

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]
}

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

【讨论】:

    猜你喜欢
    • 2012-09-16
    • 2013-03-20
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2016-01-17
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多