当您使用枚举类型(例如,let value: X = X.ONE)描述变量时,该变量需要枚举属性之一的值,而不是枚举本身。枚举的主要思想是记录和重用一组值(例如,enum Colors {BLUE: '#0000ff', YELLOW: '#ffff00'})。因此,如果您使用 Colors 枚举描述变量,则该变量将接受 Colors.BLUE 或 Colors.YELLOW 解析为颜色的实际值(例如,'#0000ff');这样该变量将无法保存 Colors 枚举本身,而只能保存枚举的值。
枚举作为对象保留在编译代码中。例如,示例中的枚举 X 和 Y 变成以下对象:
var X = { '0': 'ONE', '1': 'TWO', ONE: 0, TWO: 1 }
var Y = { '0': 'THREE', '1': 'FOUR', THREE: 0, FOUR: 1 }
在您的函数中,arg1 将包含这些枚举之一的值,即 0 或 1。因此,在您的示例中,您将能够检查 arg1 是否属于这些对象之一(例如,X[arg1] !== undefined),但您将无法保证 arg1 仅属于 X 或仅属于 Y,因为 X 和 Y 在某些时候可能包含相同的键和/或值(例如,两者都将具有键“一”)。
因此,我们需要根据价值比较做出决策,如下所示:
if (arg1 === X.ONE) {
// do something
}
if (arg2 === Y.THREE) {
// do something
}
或者通过检查一个值是否属于一个特定的枚举对象:
if (X[arg1] !== undefined) {
// do something
}
if (Y[arg1] !== undefined) {
// do something
}
没有 TS 功能可以检查值是否仅属于特定枚举。