176. 分布联合类型
极难
实现一个高级工具类型 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