检查 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 中是不是存在字符串的主要内容,如果未能解决你的问题,请参考以下文章

检查字符串是不是存在子字符串

如何检查数组的元素是不是存在于字符串中

检查字符串中是不是存在所有 char 值

如何使用BufferedReader检查csv中是不是存在多个条件字符串?

如何在Javascript中检查字符串结束位置是不是存在值? [复制]

检查多个文件中是不是存在多个字符串