从Typescript中枚举的数字值生成类型

rjee0c15  于 2022-11-18  发布在  TypeScript
关注(0)|答案(3)|浏览(211)

是否可以转换查找exmp的枚举:

enum StatusCodeEnum {
  OK = 200,
  BAD_REQUEST = 400,
  UNAUTHORIZED = 401,
  FORBIDDEN = 403,
  NOT_FOUND = 404,
  INTERNAL_SERVER_ERROR = 500,
  SERVICE_UNAVAILABLE = 503,
}

模板类型只包含数字,如

TypeFromEnum = 200 | 400 | 500 | ...  ---> numbers

我只对枚举转换感兴趣,而不切换到带有“as const”的普通对象

ckx4rj1h

ckx4rj1h1#

这在TypeScript 4.8中将是可能的,并从模板字符串类型中进行更具体的推断。
方法如下:

type TypeFromEnum = `${Extract<StatusCodeEnum, number>}` extends 
  `${infer N extends number}` ? N : never;
// type TypeFromEnum = 200 | 400 | 401 | 403 | 404 | 500 | 503

您不能轻松地迭代一个纯数值枚举,因为它在内部没有表示为联合类型,因此上面的方法首先确保它只获取数值枚举成员(如果它是一个混合的字符串/数值枚举),将它们转换为字符串类型的联合,然后通过infer N extends nmber技术转换回数值类型。
Playground代码链接

e0bqpujr

e0bqpujr2#

//can use this if you only want specific enum values

type typeFromEnum = StatusCodeEnum.OK | StatusCodeEnum.BAD_REQUEST | StatusCodeEnum.INTERNAL_SERVER_ERROR

// Or this if you want the type to be able to be any of the enum but you might as well just use the enum as the type.
type typeFromEnum = StatusCodeEnum;
qkf9rpyu

qkf9rpyu3#

试试这个:

type StatusCodeType = `${StatusCodeEnum}`

// return -> `200 | 400 | 401 | ... `

相关问题