typescript - 打字稿用枚举键迭代对象
问题描述
我想用枚举键迭代一个对象。问题是类型总是相互干扰,我宁愿不强制转换所有内容。
enum MyEnum { A, B, C }
type MyMap = { [key in MyEnum]: string };
const myMap: MyMap = {
[MyEnum.A]: 'a?',
[MyEnum.B]: 'b',
[MyEnum.C]: 'c...',
};
如果我尝试Object.keys
或for..in
它总是显示错误。
Object.keys(myMap).forEach(key => {
const data = myMap[key]; // <= Error TS7017: Element implicitly has an 'any' type because type 'MyMap' has no index signature.
});
// same with: for (const key in myMap) {
Object.keys(myMap).forEach((key: MyEnum) => { // Error TS2345: Argument of ... Type 'string' is not assignable to type 'MyEnum'.
});
我可以施放钥匙,但甚至不能直接施放...
Object.keys(myMap).forEach(key => {
const data = myMap[key as MyEnum]; // Error TS2352: Conversion of type 'string' to type 'MyEnum' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
// have to do this but would prefer not to
const data2 = myMap[key as unknown as MyEnum];
});
某处可能有一个解决方案,但我没有使用正确的关键字并且没有找到它:((编辑:或者可能没有)
解决方案
如果您不想使用any
或unknown
const data = myMap[MyEnum[key as keyof typeof MyEnum]];
推荐阅读
- java - 如果条件,命名最终静态变量的正确方法
- microsoft-graph-api - 架构扩展 Microsoft Graph API
- java - java中的终端字符编码
- python - Python,将 Json 标准化为数据框
- javascript - 如何像 React 钩子一样在 Svelte 中封装状态函数?
- javascript - Discord.js 说命令
- javascript - 如果 null 不显示默认格式 1970/01/01,如何使用日期在 ajax 中创建条件?
- asp.net - Automapper 映射异常:缺少类型映射配置或不支持的映射
- docker - 如何在 odoo 12 docker qweb 报告中插入图像
- web - 如何使用我创建的网站、离线并重新连接到本地文件而不是谷歌驱动器上的文件?