【问题标题】:How can I determine if a string is part of an enum? [duplicate]如何确定字符串是否是枚举的一部分? [复制]
【发布时间】:2020-12-24 16:16:47
【问题描述】:

我有一个枚举和一个字符串

enum Keys {
  'key1' = 'key1',
  'key2' = 'key2'
}

const key = 'key1'

有没有办法检查key 是否是枚举的一部分?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    由于术语“key”的重复,我不清楚您是否要检查属性的存在(Keys.key1 是否存在?)或值(是否存在 Keys 的 属性value 匹配“key1”)。

    要检查属性是否存在,请使用Keys[key]Keys.hasOwnProperty(key)。第一个更简洁,但因为它评估 ,如果值为 falsy,例如Keys[key] === 0,它将返回 false。

    if (Keys[key]) {
      // exists with non-falsy value. do stuff.
    }
    
    if (Keys.hasOwnProperty(key)) {
      // exists. do stuff.
    }
    

    要检查值是否存在,可以使用 Object.values 和 Array.includes:

    if (Object.values(Keys).includes(key)) {
     // do stuff
    }
    

    【讨论】:

    • hasOwnProperty 实际上不会检查枚举的值,它会匹配键。示例枚举具有与值相同的键这一事实是巧合。
    • 是的。我知道。我就是这么说的。
    • 是的,我明白了。我总是建议使用映射到的值。例如,当您收到 API 响应时,您希望将其返回的值与枚举相匹配,并将密钥用作代码中的引用。
    • 问题是如何判断key是否存在。
    • 更新说明。
    【解决方案2】:

    您可以Object.values()获取枚举的值,然后使用.includes()查看该值是否存在。

    enum Keys {
        One = 'one',
        Two = 'two'
    }
    
    Object.values(Keys).includes('one') // true
    Object.values(Keys).includes('foo') // false
    

    我还建议您不要为键使用与值相同的名称。 TypeScript 中的惯例是为您的密钥使用帕斯卡大小写名称。

    【讨论】:

    • 感谢您的回复。你知道是否有办法从枚举中获取值的联合类型?这里是one | two,
    • type SomeType = Keys.One | Keys.Two
    • 感谢回复,但编译器仍然提示类型为type SomeType = Keys 而不是one | two 这里是演示codesandbox.io/s/vigorous-rgb-u860z?file=/src/index.ts
    猜你喜欢
    • 2013-04-21
    • 1970-01-01
    • 2011-03-26
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多