我有一个像这样定义的枚举
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)
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)
打字稿枚举有点烦人,因为它们有两个方面 - 用于命名值的原子和实际值。这些都有不同的检查方法。
让我们使用一个示例枚举来表示内容拦截器可以采取的操作。我们将从 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 对变量的理解中,允许你在检查它的同时对其进行转换。
| 归档时间: |
|
| 查看次数: |
4949 次 |
| 最近记录: |