繁体   English   中英

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

[英]How to go from a mapped type to a discriminated union

抱歉,如果已经提出此问题。 我尽力找到解决方案,但可能找不到合适的术语。

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

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;
  };
}

与使用keyof T独立生成namedata类型不同,首先使用映射类型为T每个键组合正确的namedata ,然后通过keyof T对其进行索引以实现并集。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM