检查 Enum 中是不是存在字符串
Posted
技术标签:
【中文标题】检查 Enum 中是不是存在字符串【英文标题】:Check to see if string exists in Enum检查 Enum 中是否存在字符串 【发布时间】:2020-04-10 02:14:44 【问题描述】:这不是 Check if value exists in enum in TypeScript 的副本,它根据 Enum 值检查类型 Enum。
没有其他关于 TypeScript 如何根据枚举检查字符串或字符串文字的帖子。原因是我通过 API 接收数据,所以它的原始类型是字符串。
代码:
enum Method
Get = 'get',
Put = 'put',
Post = 'post',
Patch = 'patch',
Delete = 'delete'
console.log(Method);
console.log('get' in Method);
console.log(Object.values(Method));
console.log(Object.values(Method).includes('get'));
输出:
src/libs/async-express/test.ts:12:44 - error TS2345: Argument of type '"get"' is not assignable to parameter of type 'Method'.
12 console.log(Object.values(Method).includes('get'));
在 Java 中会这样:
public static boolean contains(String test)
for (Choice c : Choice.values())
if (c.name().equals(test))
return true;
return false;
在 TypeScript 中执行此操作的任何标准方法。
【问题讨论】:
TypeScript const assertions: how to use Array.prototype.includes?的可能重复 【参考方案1】:刚刚意识到你可以投射:
Object.values(Method).includes(type as Method);
【讨论】:
如果你能保证type
总是来自Method
的子集,那就没问题了。否则最好转换values()
的结果。【参考方案2】:
为避免强制类型转换,您可以在Object.values
- 中添加类型注释
这只是从Method[]
扩大了它。
但是如果你需要成功地缩小类型,你应该使用类型保护;否则您将无法将变量传递给仅接受Method
的其他函数。
// type guard fn
const isMethod = (maybeMethod: string): maybeMethod is Method =>
// explicityly type the values of Method as an array of strings,
// so they can be compared to possible invalid methods
const validMethods: string[] = Object.values(Method);
return validMethods.includes(maybeMethod);
;
// fn to demonstrate narrowing behavior
const foo = (maybeMethod: string) =>
if (isMethod(maybeMethod))
// compiler successfully narrows the type, and
const clone = maybeMethod; // (parameter) maybeMethod: Method
if (Object.values(Method).includes(maybeMethod as Method))
// the type has not actually been narrowed.
// maybeMethod is still just a string.
const clone = maybeMethod; // (parameter) maybeMethod: string
;
【讨论】:
【参考方案3】:最简单的方法(正如您自己注意到的)是使用强制转换。
// Implicit cast
const allMethods: string[] = Object.values(Method);
console.log(allMethods.includes("get"));
// Explicit cast
console.log((Object.values(Method) as string[]).includes("get"));
【讨论】:
以上是关于检查 Enum 中是不是存在字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何使用BufferedReader检查csv中是不是存在多个条件字符串?