【问题标题】:Typescript definitions for string enum key indexed objects?字符串枚举键索引对象的打字稿定义?
【发布时间】:2019-01-07 03:24:09
【问题描述】:

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

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 接口没有名字变量。似乎我缺少枚举模型和各个接口之间的映射,但我不确定。任何帮助表示赞赏。谢谢。

【问题讨论】:

  • 您可以在枚举和接口类型之间定义一个接口映射并在映射类型中使用它,但那时我不确定映射类型是否有任何好处。
  • 嗯,这比我想象的要容易。谢谢。界面和键之间的简单映射给了我想要的行为。

标签: javascript typescript typescript-typings


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    相关资源
    最近更新 更多