精读《Flip, Fibonacci, AllCombinations...》

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

解决 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值