题目描述
Implement a generic Fibonacci takes an number T and returns it's 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
题解
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'
type cases = [
Expect<Equal<Fibonacci<1>, 1>>,
Expect<Equal<Fibonacci<2>, 1>>,
Expect<Equal<Fibonacci<3>, 2>>,
Expect<Equal<Fibonacci<8>, 21>>,
]
// ============= Your Code Here =============
// ============= Your Code Here =============
type Fibonacci<
T extends number,
CurrentIndex extends any[] = [unknown],
Prev extends any[] = [],
Current extends any[] = [unknown]
> =
CurrentIndex['length'] extends T
? Current['length']
: Fibonacci<
T,
[...CurrentIndex, unknown],
Current,
[...Prev, ...Current]
>
泛型参数
-
T extends number
:确保T
是一个数值类型 -
CurrentIndex extends any[] = [unknown]
:表示当前索引,初始值为[unknown]
,长度为1
,表示从第1
个斐波那契数开始 -
Prev extends any[] = []
:表示前一个斐波那契数,初始值为空数组,长度为0
-
Current extends any[] = [unknown]
:表示当前的斐波那契数,初始值为[unknown]
,长度为1
,表示初始值为1
递归逻辑
-
当
CurrentIndex['length']
等于T
时,返回Current['length']
,即当前索引对应的斐波那契数 -
否则,递归调用
Fibonacci
,更新参数:-
CurrentIndex
:在当前索引后追加一个unknown
,表示索引加1
-
Prev
:更新为当前的斐波那契数Current
-
Current
:更新为Prev
和Current
的和,即[...Prev, ...Current]
-