首页 > 解决方案 > 如何使用枚举值的键定义一种对象

问题描述

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值的正确方法是什么?

标签: javascripttypescript

解决方案


你很亲密。你不想keyof Enum1keyof 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}
}

推荐阅读