我想强制 泛型 为数字枚举。我的意思是 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?
我将自定义的枚举传递给 SampleClass ,但是,我希望该 Generic Enum 成为数字枚举。有可能吗?
答案 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]
}
有效地将所有枚举值强制为数字。