Jack Q
2024-06-25
来自广东
// 作业: ReverseTuple type TupleCase = [1, '2', true, null, undefined, { a: Map<string, unknown>}, [], (() => void), never]; type ReverseTuple<T extends unknown[], R extends unknown[] = []> = T extends [infer First, ...infer Rest] ? ReverseTuple<Rest, [First, ...R]> : R; type Result = ReverseTuple<TupleCase>; // 探究: 遍历Tuple成员的过程 type WhatHappenInTraversalTuple<T extends any[]> = T extends [infer First, ...infer Rest] ? WhatHappenInTraversalTuple<Rest> | [First, '']: [T,'EOF']; type Happened = WhatHappenInTraversalTuple<TupleCase>;// 可以发现 T 最终会会变成 [] // [[], "EOF"] | [never, ""] | [() => void, ""] | [[], ""] | [{a: Map<string, unknown>;}, ""] | [undefined, ""] | [null, ""] | [true, ""] | ["2", ""] | [1, ""] type ReverseTuple0<T extends unknown[], R extends unknown[] = []> = T extends [] ? ['muti branch: first', R] : T extends [infer First, ...infer Rest] ? ReverseTuple0<Rest, [First, ...R]> : ['muti branch: second', R]; type ReverseTuple1<T extends unknown[], R extends unknown[] = []> = T extends [infer First, ...infer Rest] ? ReverseTuple1<Rest, [First, ...R]> : ['one branch', R]; type Res0 = ReverseTuple0<TupleCase>; // 进入手动添加的第一个分支:判断 T 为 [] 提前 终止循环 type Res1 = ReverseTuple1<TupleCase>; // T 为 [] 会自动进入 false 分支 // 原理 类似 "" extends `${infer A}${infer B}` ? [A,B] : never type Principle = [] extends [infer First, ...infer Rest] ? [First, Rest] : never;// 计算结果为 never
展开
作者回复: 非常不错。越来越得心应手了