176. 分布联合类型

极难0

实现一个高级工具类型 DistributeUnions<T> ,它将包含联合类型的数据结构转换为所有可能的,且不再包含联合类型的联合类型。数据结构可以是任意组合的对象或元组,且可以是任意嵌套层级。

例如:

type T1 = DistributeUnions<[1 | 2, 'a' | 'b']>
// expected to be [1, 'a'] | [2, 'a'] | [1, 'b'] | [2, 'b']

type T2 = DistributeUnions<{ type: 'a', value: number | string } | { type: 'b', value: boolean }>
//  expected to be { type: 'a', value: number }
//      | { type: 'a', value: string }
//      | { type: 'b', value: boolean }

type T3 = DistributeUnions<[{ value: 'a' | 'b' },  { x: { y: 2 | 3  } }] | 17>
//  expected to be [{ value: 'a' },  { x: { y: 2  } }]
//      | [{ value: 'a' },  { x: { y: 3  } }]
//      | [{ value: 'b' },  { x: { y: 2  } }]
//      | [{ value: 'b' },  { x: { y: 3  } }]
//      | 17

作为背景说明,这种类型在你想要从深层数据结构中排除某些情况时非常有用:

type ExcludeDeep<A, B> = Exclude<DistributeUnions<A>, B>

type T0 = ExcludeDeep<[{ value: 'a' | 'b' },  { x: { y: 2 | 3  } }] | 17, [{ value: 'a' },  any]>
//  expected to be [{ value: 'b' },  { x: { y: 2  } }]
//      | [{ value: 'b' },  { x: { y: 3  } }]
//      | 17
评论(0)
题库

TypeScript

加载中...