TypeScript类型挑战 - implement MapStringUnionToObjectUnion

·

1 min read

Implement MapStringUnionToObjectUnion<U> to map a string union to an object union as below.

题目出处:https://bigfrontend.dev/zh/typescript/implement-MapUnion-U-M

type A = MapStringUnionToObjectUnion<'1'>
// {
//   value: '1'
// } 

type B = MapStringUnionToObjectUnion<'1' | '2'>
// {
//   value: '1'
// } |
// {
//   value: '2
// }

1.实现思路分析

MapStringUnionToObjectUnion的泛型参数,是一个字符串联合类型。

我们需要做的,实际上是将联合类型每个类型提取出来,构造成一个对象

提取可以使用 infer 关键字

提取出来做条件判断,判断提取出来的类型是否为string,如果是,构造新的对象

2.实现

type MapStringUnionToObjectUnion<T extends string> = T extends infer U
  ? U extends string
    ? { value: U }
    : never
  : never;

type Result = MapStringUnionToObjectUnion<"a" | "b">;
// type Result = {value: "a";} | {value: "b";}

3.知识点总结

infer关键字,infer用于定义新的类型变量,并推断它的值,一般用于提取子集元素的类型