我试图做这两个函数来获取枚举的键和值。它们似乎起作用,而且我找出了大部分的输入,只剩下一个错误,我希望有人比我在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
答案 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]);
};