Typescript类型体操 - FibonacciSequence
题目
中文
实现一个输入参数为数字 T
的泛型类型 Fibonacci<T>
, 返回 T
对应的斐波那契数
斐波那契数列:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
示例:
type Result1 = Fibonacci<3>; // 2
type Result2 = Fibonacci<8>; // 21
English
Implement a generic Fibonacci<T>
that takes a number T
and returns its corresponding Fibonacci number.
The sequence starts:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
For example
type Result1 = Fibonacci<3>; // 2
type Result2 = Fibonacci<8>; // 21
答案
type Fibonacci<
T extends number,
ACC extends [any[], any[], any[]] = [[any], [any], [any, any]]
> = T extends 1 | 2
? 1
: ACC[2]['length'] extends T
? ACC[0]['length']
: Fibonacci<T, [[...ACC[0], ...ACC[1]], [...ACC[0]], [any, ...ACC[2]]]>;
第二个泛型参数ACC
的说明
第二个泛型参数ACC
是一个元组; 元组中第一个元素是一个any[]
类型的数组, 数组的长度表示 \(F_n\) ; 第二个元素代表也是一个any[]
类型的数组, 数组的长度表示 \(F_{n-1}\) ; 第三个元素还是一个any[]
类型是数组, 数组长度表示迭代次数