【问题标题】:How to go from a mapped type to a discriminated union如何从映射类型变为可区分的联合
【发布时间】:2019-02-27 08:21:00
【问题描述】:

如果这个问题已经被问过,我们深表歉意。我努力寻找解决方案,但我可能没有使用正确的术语进行搜索。

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

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

【问题讨论】:

    标签: typescript


    【解决方案1】:

    不要使用keyof T 独立生成name 和data 类型,而是首先使用映射类型将T 的每个键的正确name 和data 放在一起,然后按keyof T参加工会。

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

    【讨论】:

    • 正确答案.. 但也许可以解释一下为什么他错了,你的错了......很难支持代码 sn-ps......(虽然我做到了:-))
    • 当我怀疑 OP 是否需要它并且怀疑其他有同样问题的人将来会找到这个线程时,很难热情地写一个解释。但是我很无聊,所以在那里,我做到了。 :)
    • 你永远不知道最终是谁找到了这些 .. 我收到了我几个月前回答的问题的支持,我从没想过有人会挖掘:)
    • 实际上@MattMcCutchen 我非常感谢您的解释。我一直在努力寻找自己。因此,尽管我很感激具有背后推理的实际解决方案(那是我所缺少的),但它更有趣?
    • @MattMcCutchen 我现在意识到你在这里基本上回答了同样的问题:stackoverflow.com/a/52175735。你说得对,很难找到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2021-06-28
    • 1970-01-01
    • 2019-12-11
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多