如何正确键入从键映射的枚举值

时间:2019-06-07 07:58:38

标签: typescript enums

我试图做这两个函数来获取枚举的键和值。它们似乎起作用,而且我找出了大部分的输入,只剩下一个错误,我希望有人比我在TypeScript中更聪明的人可以帮忙...

const isInteger = /^\d+$/;

export const enumKeys = <T>(enumObj: T): string[] => {
  return Object.keys(enumObj).filter(k => !isInteger.test(k));
};

export const enumValues = <T>(enumObj: T): T[keyof T][] => {
  return enumKeys(enumObj).map(k => enumObj[k]);
};

问题出在enumObj[k]上,它会导致这种类型的错误:

  

元素隐式具有“ any”类型,因为类型“ {}”没有索引签名。 ts(7017)

我知道我可以忽略该警告,但是我想学习,而且我不明白这里{/ {1}}的隐含含义/原因,以及如何正确键入它的含义。


解决方案,基于接受的答案

any

1 个答案:

答案 0 :(得分:1)

TS的较新版本具有以下错误

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'unknown'.
  No index signature with a parameter of type 'string' was found on type 'unknown'.ts(7053)

类型参数T没有类型约束,因此默认情况下,其约束为(unknown{},取决于版本)。当您尝试使用enumObj[k]进行索引时,k的类型为string,但是enumObj不支持使用string进行索引,因为它没有可接受的索引签名string

简单的解决方案是断言k确实是T的密钥:

export const enumKeys = <T>(enumObj: T): string[] => {
  return Object.keys(enumObj).filter(k => !isInteger.test(k));
};

export const enumValues = <T>(enumObj: T): T[keyof T][] => {
  return enumKeys(enumObj).map(k => enumObj[k as keyof T]);
};