// 此实现用到了第9章infer等技术,考虑到技术同步学习,老师就之前只用了第8章的方式来解答了
// 1. 来理解你说的方案: 理解T[number] 问题就解决了
type T = [{ address: string }, { b: number }]
// S100行 结果
// { address: string; } | { b: number; }
type ObjValueType = T[number] // S100
// 2.再了解UnionToIntersection
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
// 2.1
type crossResult1 = UnionToIntersection<T[number]>
type crossResult2 = UnionToIntersection<ObjValueType>
type crossResult3 = UnionToIntersection<{ address: string } | { b: number }>
// 2.2 crossResult3等价于: 【infer 第9章讲到,先了解为占位替换即可】
type crossResult4 = (((k: { address: string }) => void) |
((k: { b: number }) => void)) extends (k: infer I) => void ? I : never
// 2.3 分解crossResult4: 等价于下面 testunion
type test1 = ((k: { address: string }) => void) extends (k: infer I) => void ? I : never
type test2 = ((k: { b: number }) => void) extends (k: infer I) => void ? I : never
type testunion = test1 & test2