检查函数参数是否是typescript中的特定枚举类型

检查函数参数是否是typescript中的特定枚举类型,typescript,enums,Typescript,Enums,我有一个函数,它接受一个参数,这个参数在typescript中有几个不同的枚举类型。我想检查参数具有哪种枚举类型。甚至可以检查吗?下面是一个示例代码: enum X { ONE, TWO } enum Y { THREE, FOUR } function check(arg1: X | Y) { if (arg1 is X) { // do something with X } if (arg1 is Y) {

我有一个函数,它接受一个参数,这个参数在typescript中有几个不同的枚举类型。我想检查参数具有哪种枚举类型。甚至可以检查吗?下面是一个示例代码:

enum X {
    ONE,
    TWO
}

enum Y {
    THREE,
    FOUR
}

function check(arg1: X | Y) {
    if (arg1 is X) {
        // do something with X
    }
    if (arg1 is Y) {
        // do something with Y
    }
}

可以使用枚举类型的保护函数,如中所示

在这种情况下:

enum X {
    ONE,
    TWO
}

enum Y {
    THREE = 3,
    FOUR
}

const isSomeEnum = <T>(e: T) => (token: any): token is T[keyof T] =>
    (Object as any).values(e).includes(token as T[keyof T]);

function check(arg1: X | Y) {
    if (isSomeEnum(X)(arg1)) {
        console.log('Arg is X')
    }
    if (isSomeEnum(Y)(arg1)) {
        console.log('Arg is Y')
    }
}

check(X.ONE)
check(Y.THREE)
check(X.TWO)
check(Y.FOUR)
enum X{
一,,
两个
}
枚举Y{
三等于三,
四
}
常量isSomeEnum=(e:T)=>(令牌:any):令牌是T[keyof T]=>
值(e)包括(标记为T[keyof T]);
功能检查(arg1:X | Y){
if(isSomeEnum(X)(arg1)){
console.log('Arg是X')
}
if(isSomeEnum(Y)(arg1)){
console.log('Arg是Y')
}
}
支票(X.1)
支票(Y.3)
支票(X.2)
支票(Y.4)

要做到这一点,您需要确保枚举值不重叠,这就是为什么您需要在Y的定义中包含“THREE=3”。

不可能。别忘了

枚举是TypeScript为数不多的功能之一,它不是一个 类型级别JavaScript的扩展

枚举允许开发人员定义一组命名常量。使用 枚举可以更容易地记录意图,或创建一组 不同的案例。TypeScript提供数字和基于字符串的脚本 枚举


在您的示例中:X.ONE=Y.THREE=0,X.TWO=Y.FOUR=1

当您使用枚举类型(例如,
let value:X=X.ONE
)描述变量时,该变量需要枚举的一个属性值,而不是枚举本身。枚举的主要思想是记录和重用一组值(例如,
enum Colors{BLUE:'#0000ff',YELLOW:'#ffff00'}
)。因此,如果使用颜色枚举描述变量,该变量将接受Colors.BLUE或Colors.YELLOW,它们解析为颜色的实际值(例如,
“#0000ff”
);因此,该变量不能保存颜色枚举本身,只能保存枚举的值

枚举作为对象保留在编译代码中。例如,示例中的枚举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]!==未定义的
),但无法保证
arg1
只属于X还是只属于Y,因为X和Y在某个点上可能包含相同的键和或值(例如,两者都有键“one”)

因此,我们需要在价值比较的基础上做出决策,比如:

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功能检查值是否专门属于特定枚举