typescript - 如何正确键入从键映射的枚举值
问题描述
我试图让这两个函数来获取枚举的键和值。它们似乎有效,而且我已经弄清楚了大部分打字,只剩下一个错误,我希望比我在 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]
,它给出了这种类型的错误:
元素隐式具有“任何”类型,因为类型“{}”没有索引签名。ts(7017)
我知道我可以忽略警告,但我想学习,我不明白这里隐含的原因/究竟是什么any
,以及如何正确键入它而不是那样。
解决方案,基于接受的答案
const isInteger = /^\d+$/;
export const enumKeys = <T>(enumObj: T): (keyof T)[] => {
return Object.keys(enumObj)
.filter(k => !isInteger.test(k))
.map(k => k as keyof T);
};
export const enumValues = <T>(enumObj: T): T[keyof T][] => {
return enumKeys(enumObj).map(k => enumObj[k]);
};
解决方案
较新版本的 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)
type 参数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]);
};
推荐阅读
- ruby - 强制 .rb 文件在特定 ruby 版本下运行
- r - 无法在 predict.rpart 中设置 type = "class"
- javascript - 如何访问未初始化的状态挂钩的属性?
- python - 从多级数据帧中提取索引作为列表中的字符串
- amazon-web-services - 找到新 AWS 账户的默认区域的最快方法是什么?
- c++ - c++:我正在使用模板创建别名声明并不断收到错误
- java - 无法更改要检查的复选框,必须重新加载要检查的页面
- java - 我添加最新的时,Spring Boot Maven 项目不会下载最新的 Oracle ojdbc8 .jar 文件
- delphi - Firemonkey Listbox 需要一个 TopItem
- fetch - 如何获取视频> 100的vimeo链接