【问题标题】:Best way to cast an object to a TypeScript Enum Value将对象转换为 TypeScript 枚举值的最佳方法
【发布时间】:2021-12-23 04:06:57
【问题描述】:

是否有一种简单/最佳实践的方法可以将 any 值转换为 TypeScript 枚举,如果没有值则抛出异常。

举个例子

您有一个明确的请求对象,并且正在使用query.option 值。您的应用程序知道它只有两个有效状态 a|b。然而,互联网和请求对象的现实是它可以是很多东西(未定义,a,b,foo)。

enum OPTIONS_ENUM {
  a = 'a',
  b = 'b'
}

function handleRequest(req: Request): OPTIONS_ENUM {
  // This will error because query.option is an any
  return OPTIONS_ENUM[req.query?.option]
}

我一直在做的事情似乎有点冗长。我在每个枚举旁边都有一个“cast”函数,如果 ENUM 没有值,则会抛出该函数。

function castToOptionsEnum(option: any): OPTIONS_ENUM {
  if (!Object.values(OPTIONS_ENUM)?.includes(option)) {
    throw new Error(`Invalid Value for option, must be one of ${Object.values(OPTIONS_ENUM)}`)
  }
 
  // @ts-ignore
  return OPTIONS_ENUM[option]
}

function handleRequest(req: Request) {
  // This will error because the option query is unknowable 
  return castToOptionsEnum(req.query?.option)
}

【问题讨论】:

标签: javascript typescript express


【解决方案1】:

castToOptionsEnum 中访问OPTIONS_ENUM 时,您可以“简单”地将option 转换为OPTIONS_ENUM

function castToOptionsEnum(option: any): OPTIONS_ENUM {
    if (!Object.values(OPTIONS_ENUM)?.includes(option)) {
        throw new Error(`Invalid Value for option, must be one of ${Object.values(OPTIONS_ENUM)}`);
    }

    return OPTIONS_ENUM[option as OPTIONS_ENUM];
}

这将删除所有编译错误(我建议也删除// @ts-ignore,因为它“隐藏”编译错误 - 但这取决于你^^)。

【讨论】:

  • 有什么方法可以避免需要强制转换功能吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2014-03-29
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多