【发布时间】:2020-12-24 16:16:47
【问题描述】:
我有一个枚举和一个字符串
enum Keys {
'key1' = 'key1',
'key2' = 'key2'
}
const key = 'key1'
有没有办法检查key 是否是枚举的一部分?
【问题讨论】:
标签: typescript
我有一个枚举和一个字符串
enum Keys {
'key1' = 'key1',
'key2' = 'key2'
}
const key = 'key1'
有没有办法检查key 是否是枚举的一部分?
【问题讨论】:
标签: typescript
由于术语“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 实际上不会检查枚举的值,它会匹配键。示例枚举具有与值相同的键这一事实是巧合。
您可以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