字符串枚举键索引对象的打字稿定义?

时间:2019-01-06 18:42:33

标签: javascript typescript typescript-typings

我定义了以下枚举和数据模型:

const enum Models {
  Location = 'Location',
  Person = 'Person',
  Vehicle = 'Vehicle'
}

export interface Location {
  name?: string,
  city?: string,
  state: string,
  zip?: string,
}

export interface Person {
  firstname: string,
  lastname?: string,
}

export interface Vehicle {
  model: string,
  year?: string,
}

我的数据定义如下:

type ModelMap = {[key in Models]: Location | Person | Vehicle}

const data: ModelMap = {  
  [Models.Location]: { state: 'CA' },
  [Models.Location]: { state: 'OR' },
  [Models.Location]: { state: 'CO', firstname: 'blah' },
  [Models.Person]: { firstname: 'John', lastname: 'Doe' },
  [Models.Vehicle]: { model: 'Ford', year: '2018' },
}

这有效,但不对每个对象强制使用特定类型。相反,它强制执行三种类型的联合,即位置|人车辆。

是否可以强制执行特定的对象类型以匹配枚举索引键?如果是这样,怎么办?

例如,我希望第三个location对象无法进行类型检查,因为Location接口没有firstname变量。似乎我缺少枚举模型与各个接口之间的映射,但不确定。任何帮助表示赞赏。谢谢。

1 个答案:

答案 0 :(得分:2)

我最终在接口和枚举之间创建了一个映射,如下所示:

type EnumInterfaceMap = { Location: Location; Person: Person; Vehicle: Vehicle };
type ModelMap = {[key in Models]: EnumInterfaceMap[key]}