有没有一种简单的方法可以从打字稿中获取枚举中的键/数字列表?

时间:2018-01-24 01:49:37

标签: typescript

我想要一个简单的方法从枚举器中获取一个键列表,我尝试了Object.keys,但它返回了6个键,0-5,我认为它会出现因为当我尝试foreach这个枚举时,这个返回键和值列表,是否有一种简单的方法只返回键,我不想返回mount并返回另一个列表。

我将使用此反应

我的枚举:

enum ObservationType {
    Accomodation = 1,
    Addtional = 2,
    LandTransport = 3
}

我试过的示例并返回了六个值:

{Object.keys(ObservationType).map((type) => <div>{type}</div>)}

7 个答案:

答案 0 :(得分:1)

来自TypeScript enum documentation

  

在这个生成的代码中,枚举被编译成一个对象,该对象存储forward(name - &gt; value)和reverse(value - &gt; name)映射。对其他枚举成员的引用始终作为属性访问发出,并且从不内联。

     

请记住,字符串枚举成员根本不会生成反向映射。

这意味着如果你能够,你可能想要使用字符串枚举,例如:

enum ObservationType {
  Accomodation = 'Acc',
  Addtional = 'Addt',
  LandTransport = 'LandT',
}

// Object.keys will only have the three keys.

处理此问题的另一种方法是跟踪映射值以仅获取反向映射一次。这需要首先设置对象的数字键,这不一定是保证:

enum ObservationTypeNums {
  Accomodation,
  Addtional,
  LandTransport,
}

Object.keys(ObservationTypeNums).reduce((arr, key) => {
  if (!arr.includes(key)) {
    arr.push(ObservationTypeNums[key]);
  }
  return arr;
}, []);

// arr now has only the string keys

否则你只需要像你一样过滤掉数字键。

答案 1 :(得分:0)

ObservationType对象将包含密钥:AccomodationAdditionalLandTransport123和是how enums work in TypeScript的基础。

如果您只想要string个名称,那就可以使用简单的filter

{Object.keys(ObservationType).filter(k => typeof key === 'string').map((type) => <div>{type}</div>)}

答案 2 :(得分:0)

Object.keys(ObservationType).filter(k => isNaN(Number(k)))

向@basarat授予我的答案。

答案 3 :(得分:0)

我很难找到一个好的答案。

看起来enum生成了一个Object,如下所示:

{
  key0: 0,
  key1: 1,
  0: key0,
  1: key1
}

这就是我所做的:

const observationTypes: string[] = Object.keys(ObservationType).filter((_, i) => ObservationType[i] !== undefined).map((_, i) => ObservationType[i]);

这给了我一个字符串数组:

{
  0: "a",
  1: "b",
  2: "c",
  3: "d",
  4: "e",
  ...
}

您可以轻松地对此进行修改,以创建类似于您的问题的元素。

答案 4 :(得分:0)

对于字符串枚举(带有字符串值),您可以只使用 while new_value != previous_value: #wait #do something #put contents of new_value into previous_value #update new_value from external source (e.g. URL from browser, which may or not be have changed) else: #wait #do nothing #put contents of new_value into previous_value #update new_value from external source continue / Object.keys(myEnum)

对于数字枚举,以下方法可以在没有 Object.values(myEnum) 的情况下工作,这对于某些键可能会出错:

isNan

答案 5 :(得分:0)

以下可以映射枚举的键,您可以使用 ObservationType[key] 获取每个键的值。

(Object.keys(ObservationType) as Array<keyof typeof ObservationType>).map(key, index) => {} 

答案 6 :(得分:0)

尝试使用

Object.keys(enumObj).filter(key => isNaN(Number(key)))

它涵盖了所有类型的枚举,包括异构枚举。