如何从映射类型转变为有区别的联合

时间:2018-09-23 18:04:28

标签: typescript

很抱歉是否已经提出这个问题。我尽力找到解决方案,但可能找不到正确的术语。

我的问题始于这种结构。这是一个简单的映射类型:

type Mapped = {
  square: {
    size: number;
  };
  rectangle: {
    width: number;
    height: number;
  };
};

然后我有一个试图创建联合的类型:

type Unionize<T> = {
  name: keyof T;
  data: T[keyof T];
};

type Out = Unionize<Mapped>;

它产生这种类型:

type Generated = {
  name: "square" | "rectangle";
  data: {
    size: number;
  } | {
    width: number;
    height: number;
  };
}

但是我真正想要的是,因为这样我就可以区分杠杆作用的联合来推断和检查数据属性。

type Wanted = {
  name: "square";
  data: {
    size: number;
  };
} | {
  name: "rectangle";
  data: {
    width: number;
    height: number;
  };
}

1 个答案:

答案 0 :(得分:2)

与其使用name独立生成datakeyof T类型,不如使用映射类型将正确的namedata合并在一起T的键,然后按keyof T对其进行索引以建立并集。

type Unionize<T> = {
  [P in keyof T]: {
    name: P;
    data: T[P];
  }
}[keyof T];