BFE.devAI解答 - TypeScript 类型谜题
45. implement Slice<A, S, E>
type Slice<A extends any[], S extends number, E extends number = A['length']> = A extends [...infer F, ...infer L] ? (F['length'] extends S ? L : Slice<L, S, E>) extends [...infer FF, ...infer LL] ? (LL['length'] extends A['length'] ? [...F, ...FF] : Slice<F, S, E>) : never : never : never
Explanation:
We use the recursive approach to grab the sliced array.
First, we separate the array into two parts, F
and L
. F
are the elements before the start index S
, and L
are the elements from the start index S
.
If S
is equal to F.length
, it means we don't need to grab anything from F
, so we can just return L
.
If not, we need to keep searching in L
for the correct E
.
We use infer
to get the type of FF
(elements before LL
) and LL
(elements from E
).
If LL.length
is equal to the original array's length
, it means we have grabbed all the elements we need, so we can simply concatenate F
and FF
to get the final result.
If not, we recursively search in F
with the same S
to grab more elements from the left side.
If we cannot match any condition, it means the input types are wrong and we return never
.