如何在TypeScript中获得随机枚举?

Laz*_*vić 7 enums typescript

如何从枚举中获取随机项?

enum Colors {
  Red, Green, Blue
}

function getRandomColor(): Color {
  // return a random Color (Red, Green, Blue) here
}
Run Code Online (Sandbox Code Playgroud)

sar*_*ink 12

上面的大部分答案都是返回枚举键,但我们真的不关心枚举值吗?

如果您使用 lodash,这实际上很简单:

_.sample(Object.values(myEnum)) as MyEnum
Run Code Online (Sandbox Code Playgroud)

不幸的是,强制转换是必要的,因为这会返回any. :(

如果您不使用 lodash,或者您希望将其作为自己的函数,我们仍然可以通过将@Steven Spungin 的答案修改为如下所示来获得类型安全的随机枚举:

function randomEnum<T>(anEnum: T): T[keyof T] {
  const enumValues = (Object.values(anEnum) as unknown) as T[keyof T][];
  const randomIndex = Math.floor(Math.random() * enumValues.length);
  return enumValues[randomIndex];
}
Run Code Online (Sandbox Code Playgroud)

  • `Object.values(myEnum)` 发生了一些奇怪的事情 - 它返回一个混合字符串和数字的数组,例如上面的 Colors 枚举的 `['Red', 'Green', 'Blue', 0, 1, 2]`。Object.keys 执行相同的操作,只是在这种情况下数字也是字符串:`['Red', 'Green', 'Blue', '0', '1', '2']` (3认同)

Ste*_*gin 7

在从其他解决方案和关键字中获得很多启发之后keyof,这是一个返回类型安全随机枚举通用方法

function randomEnum<T>(anEnum: T): T[keyof T] {
  const enumValues = Object.keys(anEnum)
    .map(n => Number.parseInt(n))
    .filter(n => !Number.isNaN(n)) as unknown as T[keyof T][]
  const randomIndex = Math.floor(Math.random() * enumValues.length)
  const randomEnumValue = enumValues[randomIndex]
  return randomEnumValue;
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

interface MyEnum {X, Y, Z}
const myRandomValue = randomEnum(MyEnum) 
Run Code Online (Sandbox Code Playgroud)

myRandomValue将为类型MyEnum

  • 嗯,对我不起作用,这是基于数字的枚举吗? (2认同)

ILi*_*ood 6

怎么样,使用es2017 中的Object.values(IE 不支持,其他浏览器支持更新):

function randEnumValue<T>(enumObj: T): T[keyof T] {
  const enumValues = Object.values(enumObj);
  const index = Math.floor(Math.random() * enumValues.length);
  
  return enumValues[index];
}
Run Code Online (Sandbox Code Playgroud)


Dou*_*ina 6

所以没有答案对我有用,我最终这样做:

具有以下枚举

export enum Jokenpo {
  PAPER = 'PAPER',
  ROCK = 'ROCK',
  SCISSOR = 'SCISSOR',
}
Run Code Online (Sandbox Code Playgroud)

随机选择

const index= Math.floor(Math.random() * Object.keys(Jokenpo).length);
const value= Object.values(Jokenpo)[index];

return Jokenpo[value];
Run Code Online (Sandbox Code Playgroud)

我只是从枚举中获取一个随机值并使用它来转换为真实值。