Typescript 如何在Typescrpt中表示互连的类型层次结构

Typescript 如何在Typescrpt中表示互连的类型层次结构,typescript,Typescript,我是TypeScript新手,我正在尝试找出如何最好地表达类型依赖关系。我正在制作一个具有以下层次结构的游戏: enum Factions { Government, Intelligentsia } enum GovernmentTypes { Liberal, Autocratic, Neutral } enum IntelligentsiaTypes { Scientific, Religious, Neutral } interface Buildi

我是TypeScript新手,我正在尝试找出如何最好地表达类型依赖关系。我正在制作一个具有以下层次结构的游戏:

enum Factions {
  Government,
  Intelligentsia
}

enum GovernmentTypes {
  Liberal,
  Autocratic,
  Neutral
}

enum IntelligentsiaTypes {
  Scientific,
  Religious,
  Neutral
}

interface Building {
  name: string,
  faction: Factions,
  subtype: ?--HOW-TO-EXPRESS-THIS-TYPE--?
}
我希望这样,当建筑的派系是:

  • 政府-子类型仅限于政府类型
  • Intelligentsia-子类型仅限于Intelligentsia类型
实现这一目标的最佳方式是什么?提前感谢。

用于接口定义,即

interface Building<T> {
  name: string,
  faction: Factions,
  subtype: T
}

// usage
const building: Building<GovernmentTypes>
接口构建{
名称:string,
派系:派系,,
亚型:T
}
//用法
康斯特大厦
枚举派系{
政府,,
知识分子
}
枚举政府类型{
开明的
专制的,
中立的
}
枚举类型{
科学的,
宗教的,
中立的
}
界面建筑{
名称:string,
派系:派系,,
亚型:T
}
出口级政府大楼实施建筑{
name=“name1”;
派系=派系。政府;
子类型=GovernmentTypes.Neutral;
构造函数(子类型:GovernmentTypes){
this.subtype=子类型;
}
}
导出类智能建筑实现了建筑{
name=“name1”;
派系=派系。知识分子;
子类型=智能类型。中性;
构造函数(子类型:IntelligentsiaTypes){
this.subtype=子类型;
}
}

您真正想要表达的是
派系
***类型
之间的关系

我在
派系
对象类型中捕捉到了这种关系

以下内容应以您期望的方式添加约束:

枚举政府类型{
开明的
专制的,
中立的
}
枚举类型{
科学的,
宗教的,
中立的
}
类型派系={
政府:政府类型
知识分子:知识分子类型
}
界面建筑{
名称:string
派系:T
子类型:派系[T]
}
常数1:建筑={
名称:‘Asd’,
派系:"政府",,
子类型:政府类型。专制
}//编译
常数0:建筑={
名称:‘Asd’,
派系:"政府",,
子类型:智能类型。中性
}//不编译

派系=派系。政府;子类型=智能类型。中性这正是我想避免的情况我不明白-你想在一个建筑的实现上有多个子类型吗?我想根据建筑的派系对子类型属性进行类型检查。我不确定你能通过继承实现这一点。我的更新-我不认为你能让它比这更通用不强制以正确的方式将派系和子类型连接起来。i、 我不想将派系设置为“政府”,但有“知识分子”的子类型。你们读过这篇文章@debel吗?是的,但我不认为这对我的问题有帮助,我有两个逻辑层次的枚举。太好了,非常感谢!另外一个问题:当我现在尝试使用枚举作为映射的键并创建一个扩展建筑接口的类时。我需要将派系的值转换为常量,否则我得到的“派系类型”不能分配给“派系.政府”类型。我是错过了什么,还是这样做的在第29行,如果我投下它,它会起作用。谢谢你的帮助!你真的必须为派系使用enum吗?如果你只使用union类型,那么你就不需要这样做了。总之,一般来说,联合类型比枚举更受欢迎,快速的谷歌搜索应该会给你提供理由!
enum Factions {
  Government,
  Intelligentsia
}

enum GovernmentTypes {
  Liberal,
  Autocratic,
  Neutral
}

enum IntelligentsiaTypes {
  Scientific,
  Religious,
  Neutral
}

interface Building<T> {
  name: string,
  faction: Factions,
  subtype: T
}

export class GovermentBuilding implements Building<GovernmentTypes> {
    name = "name1";
    faction = Factions.Government;
    subtype = GovernmentTypes.Neutral;

    constructor(subtype: GovernmentTypes) {
        this.subtype = subtype;
    }
}

export class IntelligentsiaBuilding implements Building<IntelligentsiaTypes> {
    name = "name1";
    faction = Factions.Intelligentsia;
    subtype = IntelligentsiaTypes.Neutral;

    constructor(subtype: IntelligentsiaTypes) {
        this.subtype = subtype;
    }
}