[Typescript] Transform a Discriminated Union into a Union

Consider this discriminated union called Fruit:

type Fruit =
  | {
      name: "apple";
      color: "red";
    }
  | {
      name: "banana";
      color: "yellow";
    }
  | {
      name: "orange";
      color: "orange";
    };

 

We want transform it to:

type tests = [
  Expect<
    Equal<TransformedFruit, "apple:red" | "banana:yellow" | "orange:orange">
  >
];

 

Solution:

type TransformedFruit = {
  [F in Fruit as F["name"]]: `${F["name"]}:${F["color"]}`;
}[Fruit["name"]];

 

so for discriminated union, if we do: Fruit["name"], what we got is:

Fruit["name"] // "apple" | "banana" | "orange"

Which means, as long as we can construct such type:

{
    apple: "apple:red";
    banana: "banana:yellow";
    orange: "orange:orange";
}

problem will be resolved:

type TransformedFruit = {
  [F in Fruit as F["name"]]: `${F["name"]}:${F["color"]}`;
};

Now, we just need to map over it:

type TransformedFruit = {
  [F in Fruit as F["name"]]: `${F["name"]}:${F["color"]}`;
}[Fruit["name"]];

 

posted @   Zhentiw  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2019-12-13 [Algorithm] 21. Merge Two Sorted Lists
2019-12-13 [Algorithm] 387. First Unique Character in a String
2018-12-13 [Algorithom] Stack Data Structure in JavaScript
2017-12-13 [Python] Use Python Classes
2017-12-13 [Python] Understand Scope in Python
2017-12-13 [Python] Handle Exceptions to prevent crashes in Python
2017-12-13 [Python] Read and Parse Files in Python
点击右上角即可分享
微信分享提示