javascript - 如何使用枚举值的键定义一种对象
问题描述
export const enum Enum1{
key1='value1',
key2='value2',
key3='value3',
}
type ObjType = {
[Key in keyof Enum1]: {
some_object: number
}
}
export const obj1:ObjType ={
[Enum1.key1]:{some_object:123},
[Enum1.key2]:{some_object:123},
[Enum1.key3]:{some_object:123}
}
上面的代码产生一个错误:
错误:(145, 3) TS2322: Type '{ [Enum1.key1]: { some_object: number; }; [Enum1.key2]: { some_object: number; }; [Enum1.key3]: { some_object: number; }; }' 不可分配给类型 'Obj'。对象字面量只能指定已知属性,而“[Enum1.key1]”在“Obj”类型中不存在。
我想定义一个类型(ObjType
),它的键是枚举的所有值。Enum1
我怎样才能做到这一点?如果不可能,那么强制obj1
键包含所有Enum1
值的正确方法是什么?
解决方案
你很亲密。你不想keyof Enum1
。keyof Enum1
本质上是keyof
一个枚举值,因为这是一个字符串枚举,所以它是keyof string
. 该Enume1
类型可以看作是所有枚举成员的联合,因此您可以使用它:
export const enum Enum1{
key1='value1',
key2='value2',
key3='value3',
}
type ObjType = {
[Key in Enum1]: {
some_object: number
}
}
export const obj1:ObjType ={
[Enum1.key1]:{some_object:123},
[Enum1.key2]:{some_object:123},
[Enum1.key3]:{some_object:123}
}
推荐阅读
- python - Python Dask - 所有列的分组性能
- php - openssl_decrypt():为 AEAD 密码解密设置标签失败
- node.js - Google IOT:在 sendCommandtoDevice 失败后识别设备重新联机
- sql-server-2016 - bringing back a TDE database in AlwaysOn gives an error
- tesseract - Recognize the pdf type
- algorithm - 给定 n 个整数的列表,找到总和大于或等于 x 的最小基数子集
- java - Java中的时间计算问题
- reactjs - 即使数据未更改,传单集群标记也会重新呈现并关闭打开的蜘蛛
- r - “上次更新时间...”的日期在本地预览版和部署时不同
- android - 来自 json 字符串 loadurl() android 的 webview