解决 TS 问题的最好办法就是多练,这次解读 type-challenges Medium 难度 49~56 题。
精读
Flip
实现 Flip<T>,将对象 T 中 Key 与 Value 对调:
Flip<{ a: "x", b: "y", c: "z" }>; // {x: 'a', y: 'b', z: 'c'}
Flip<{ a: 1, b: 2, c: 3 }>; // {1: 'a', 2: 'b', 3: 'c'}
Flip<{ a: false, b: true }>; // {false: 'a', true: 'b'}
在 keyof 描述对象时可以通过 as 追加变形,所以这道题应该这样处理:
type Flip<T> = {
[K in keyof T as T[K]]: K
}
由于 Key 位置只能是 String or Number,所以 T[K] 描述 Key 会显示错误,我们需要限定 Value 的类型:
type Flip<T extends Record<string, string | number>> = {
[K in keyof T as T[K]]: K
}
但这个答案无法通过测试用例 Flip<{ pi: 3.14; bool: true }>,原因是 true 不能作为 Key。只能用字符串 'true' 作为 Key,所以我们得强行把 Key 位置转化为字符串:
// 本题答案
type Flip<T extends Record<string, string | number | boolean>> = {
[K in keyof T as `${T[K]}`]: K
}
Fibonacci Sequence
用 TS 实现斐波那契数列计算:
type Result1 = Fibonacci<3> // 2
type Result2 = Fibonacci<8> // 21
由于测试用例没有特别大的 Case,我们可以放心用递归实现。JS 版的斐波那契非常自然,但 TS 版我们只能用数组长度模拟计算,代码写起来自然会比较扭曲。
首先需要一个额外变量标记递归了多少次,递归到第 N 次结束:
type Fibonacci<T extends number, N = [1]> = N['length'] extends T ? (
// xxx
) : Fibonacci<T, [...N, 1]>
上面代码每次执行都判断是否递归完成,否则继续递归并把计数器加一。我们还需要一个数组存储答案,一个数组存储上一个数:
// 本题答案
type Fibonacci<
T extends number,
N extends number[] = [1],
Prev extends number[] = [1],
Cur extends number[] = [1]
> = N['length'] extends T
? Prev['length']
: Fibonacci<T, [...N, 1], Cur, [...Prev, ...Cur]>
递归时拿 Cur 代替下次的 Prev,用 [...Prev, ...Cur] 代替下次的 Cur,也就是说,下次的 Cur 符合斐波那契定义。
AllCombinations
实现 AllCombinations<S> 对字符串 S 全排列:
type AllCombinations_ABC = AllCombinations<'ABC'>
// should be '' | 'A' | 'B' | 'C' | 'AB' | 'AC' |&nb
TypeScript挑战解析: Flip、Fibonacci、全排列与更多

这篇博客详细解读了使用TypeScript解决一系列编程挑战,包括Flip函数实现对象Key与Value互换,Fibonacci数列计算,字符串全排列AllCombinations,以及GreaterThan、Zip、IsTuple、Chunk和Fill等实用函数的类型定义。文章通过递归和辅助变量等技巧展示了如何在TypeScript中处理复杂类型操作,并提供了每个问题的解决方案。
最低0.47元/天 解锁文章
1253

被折叠的 条评论
为什么被折叠?



