如何检查Enum中是否存在给定的字符串

RKS*_*ode 11 typescript

我有一个像这样定义的枚举

export enum someEnum {
    None = <any>'',
    value1 = <any>'value1',
    value2 = <any>'value2',
    value3 = <any>'value3'   
}
Run Code Online (Sandbox Code Playgroud)

例如,我想检查枚举中是否存在"value4".我应该得到错误,因为在枚举中没有定义value4.

我尝试if (someEnum['value4'])但是得到错误 - 元素隐式具有"任何"类型,因为索引表达式不是"数字"类型.

Rya*_*ugh 15

您可以使用in运算符:

if ('value4' in someEnum) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您的值与键相同,则此功能仅适用于基于数字的枚举或字符串枚举 (8认同)

tsu*_*ujp 14

对于目标为 es2017 或更高版本的 TypeScript 3.7

enum EList {
  ITEM_FOO = 'fooData',
  ITEM_BAR = 'barData'
}

const lookingForKey = 'ITEM_BAR'
const lookingForValue = 'barData'

// test if `lookingForKey` exists within `EList`
console.log(Object.keys(EList).some((v) => v === lookingForKey))

// test if `lookingForValue` exists within `EList`
console.log(Object.values(EList).some((v) => v === lookingForValue))
Run Code Online (Sandbox Code Playgroud)

  • @enanone,“in”运算符仅检查键,因此它仅适用于基于数字的枚举或字符串枚举,其中键等于值。如果枚举键与值不同,这将起作用。这是一个[ts游乐场](https://www.typescriptlang.org/play?#code/KYOWrgtgBAogMgSwM4BcoG8BQUoEkAqMAsgPoBiA8hVALxQDkAZgPbMAiAhih-QDTZ5CpAEIBBAEq0GAIw4AnTt3qYAvpkwBjZiCTMANsAB0e5gHMAFACICxclUtQEIWilQB KANxQA9N6go5MGBNbV0DYzMrWQUuDgcnF2QUTx8-Rg49JGAgA)您可以在 (2认同)

Zac*_*ack 6

打字稿枚举有点烦人,因为它们有两个方面 - 用于命名值的原子和实际值。这些都有不同的检查方法。

让我们使用一个示例枚举来表示内容拦截器可以采取的操作。我们将从 API 中获取一个短横线大小写值,但希望在 TS 中使用驼峰大小写值:

enum ActionType {
  block = "block",
  cssDisplayNone = "css-display-none",
  ignorePreviousRules = "ignore-previous-rules"
}
Run Code Online (Sandbox Code Playgroud)

ActionType.cssDisplayNone现在,如果我们想检查代码中的说法是否有效,我们可以使用in运算符进行检查。然而,如果我们有一个来自 API 的值,并且我们想看看我们得到的是否是一个ActionType,那么这是行不通的!

const canBlockCss = 'cssDisplayNone' in ActionType; // Returns true
const isValidAction = 'css-display-none' in ActionType; // Returns false!
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们需要编写一个类型保护

function isActionType(test: any): test is ActionType {
    return (Object.values(ActionType).indexOf(test) !== -1);
}

const isValidAction = isActionType('css-display-none') // Returns true
Run Code Online (Sandbox Code Playgroud)

这样做还有一个额外的好处,如果你有一个未知类型的变量并将其传递给类型保护,则返回值将包含在 Typescript 对变量的理解中,允许你在检查它的同时对其进行转换。