Typescript如何不用类型断言将string收窄为enum枚举的键
实现方案
TS原生不会将in判断作为枚举成员的类型收窄依据,你可以通过自定义类型谓词工具函数实现自动收窄,全程不需要额外类型断言:
- 先定义通用的枚举成员判断函数
// 泛型兼容所有枚举类型 function isEnumMember<T extends object>(enumObj: T, value: unknown): value is T[keyof T] { return Object.values(enumObj).includes(value as T[keyof T]); }
- 替换原有代码里的
in判断即可
enum SupportedShapes { circle = 'circle', triangle = 'triangle', square = 'square', } declare const square: string; if (isEnumMember(SupportedShapes, square)) { // 此处square已经被自动收窄为SupportedShapes类型,调用无报错 SupportedShapes[square]; }
补充说明
你原有代码里的if (square in SupportedShapes)逻辑本身存在隐患:in运算符判断的是对象的键,对于字符串枚举而言,只有当枚举的键名和值完全相等时这个判断才成立,如果后续你修改枚举的键值对应关系,这个判断会直接失效,用Object.values匹配枚举值的方式逻辑更严谨。
内容的提问来源于stack exchange,提问作者user578895
相关产品推荐
相关产品推荐

