解法1 - 暴力:
type GetMiddleElement<T extends any[], L extends any[] = [], R extends any[] = [], M extends "L" | "R" = "L"> = T["length"] extends 0
? []
: [...L, ...R]["length"] extends T["length"]
? L["length"] extends R["length"]
? [[1, ...T][L["length"]], [1, ...T][[...L, 1]["length"]]]
: [[1, ...T][L["length"]]]
: M extends "L"
? GetMiddleElement<T, [...L, 1], R, "R">
: GetMiddleElement<T, L, [...R, 1], "L">;
解法2 - 类似动态规划的思路:
[any, infer M, any]
的形式type GetMiddleElement<T extends any[]> = T extends 0 | 1 | 2 ? T : T extends [any, infer M, any] ? GetMiddleElement<M> : [];
Solution by tototi5997 #33547
type GetMiddleElement<T extends any[]> = T['length'] extends 0 | 1 | 2
? T
: T extends [infer _, ...infer Rest, infer _]
? GetMiddleElement<Rest>
: never;
Solution by sunupupup #33446
// your answers
type GetMiddleElement<T> = T extends [infer S, ...infer M, infer L]
? M['length'] extends 1
? M : M['length'] extends 0
? [S,L] : GetMiddleElement<M>
:T
Solution by pea-sys #33270
// 你的答案
type GetMiddleElement<T extends any[]> = T extends [infer L,...infer M , infer R]
? M extends []
? [L,R]
: GetMiddleElement<M>
: T
Solution by shanguoteng #32816
type GetMiddleElement<T extends unknown[]> = T extends [infer First, ...infer Middle, infer Last]
? Middle['length'] extends 1
? Middle
: Middle['length'] extends 0
? [First, Last]
: GetMiddleElement<[...Middle]>
: T```
Solution by keyurparalkar #32709
// your answers
type GetMiddleElement<T extends any[]> = T extends []
? []
: T extends [infer Last]
? T
: T extends [infer First, infer Last]
? T
: T extends [infer First, ...infer Middles extends any[], infer Last]
? GetMiddleElement<Middles>
: never;
Solution by kakasoo #32163
type GetMiddleElement<T extends any[], U = T> = T extends [
infer _F,
...infer C,
infer _L
]
? C["length"] extends 1 | 2
? C
: GetMiddleElement<C, T>
: U;
Solution by moonpoet #31021
type GetMiddleElement<T extends any[]> = T extends [infer X, ...infer Y, infer Z] ?
Y extends [] ? [X, Z] : GetMiddleElement<Y>
: T
Solution by zzz1220 #30880
// your answers
type GetMiddleElement<T extends unknown[]> =
T extends [infer F, ...infer M, infer L]
? M extends []
? [F, L]
: [M] extends [never]
? F
: GetMiddleElement<M>
: T
Solution by enochjs #30542
// 你的答案
type GetMiddleElement<T> = T extends [unknown, ...infer R, unknown] ? R extends [] ? T : GetMiddleElement<R> : T
Solution by YE840926098 #30136
type Shift<T> = T extends [any, ...infer Rest] ? Rest : never;
type GetMiddle<T extends unknown[], K extends unknown[]> = T extends [
infer First,
infer Second,
...any
]
? K["length"] extends 0
? [First, Second]
: [First]
: T;
type GetMiddleElement<
T extends unknown[],
Fast extends unknown[] = T,
Slow extends unknown[] = T
> = Fast extends [any, any, ...infer Rest]
? GetMiddleElement<T, Rest, [] extends Rest ? Slow : Shift<Slow>>
: GetMiddle<Slow, Fast>;
Solution by idebbarh #29942
// 提取构造 // 当 T 长度为 0 | 1 | 2 时,中间元素就是 T 本身 // 然后构造,不断递归,去掉数组第一个和最后一个,提取中间元素,直至满足上面条件
type GetMiddleElement<T extends unknown[]> =
T['length'] extends 0 | 1 | 2
? T
: T extends [infer F, ...infer M, infer L]
? GetMiddleElement<M>
: never
Solution by stevenaces #29450
type GetMiddleElement<T extends unknown[]> = T extends
| [infer Midlle]
| [infer Left, infer Right]
? T
: T extends [infer First, ...infer Rest, infer Last]
? GetMiddleElement<Rest>
: T;
Solution by DoubleWoodLin #28852
type GetMiddleElement<T extends unknown[]> =
T["length"] extends 0 | 1 | 2 ?
T :
T extends [infer _, ...infer Rest, infer _]
? GetMiddleElement<Rest>
: []
Solution by smileboyi #27218
type PlusOne<Number, Current extends any[]= [], Next extends any[] = [...Current, never]> = Number extends Current['length'] ? Next['length'] : PlusOne<Number, Next>
type GetMiddleElement<T extends readonly any[]> = GetMiddleHelper<T>
type GetMiddleHelper<T extends readonly any[], Prev extends 'hi'[] = []> =
T extends [infer First, ...infer Rest]
? Rest['length'] extends Prev['length']
? [First]
: PlusOne<Prev['length']> extends Rest['length'] ? [First, Rest[0]]: GetMiddleHelper<Rest, ['hi', ...Prev]>
: [] // Base Case
Solution by amsuarez99 #26774
type GetMiddleElement<TArray extends any[]> = TArray extends [
infer Head,
...infer Center,
infer Tail,
]
? Center extends []
? [Head, Tail]
: GetMiddleElement<Center>
: TArray
Solution by valentynpodkradylin #26270
// your answers
type GetMiddleElement<T extends any[]> = T extends [
infer F,
...infer M,
infer L
]
? M["length"] extends 0
? [F, L]
: GetMiddleElement<M>
: T;
Solution by DvYinPo #25904
// 你的答案
type GetMiddleElement<T extends unknown[]> =
T['length'] extends 0 | 1 | 2
? T
: T extends [infer X, ...infer M, infer Y]
? GetMiddleElement<M>
: []
Solution by kiki-zjq #25765
type Head<T> = T extends [infer First, ...any[]]
? First
: never
type Tail<T> = T extends [any, ...infer Rest]
? Rest
: []
type Helper<Fast extends unknown[], Slow> = Fast extends [any, any, ...infer Rest]
? Helper<Rest, Tail<Slow>>
: Fast['length'] extends 1
? [Head<Tail<Slow>>]
: [Head<Slow>, Head<Tail<Slow>>]
type GetMiddleElement<T extends unknown[]> = T['length'] extends 0
? []
: Helper<T, [never, ...T]>
Solution by Sun79 #24895
type GetMiddleElement<T extends any[]> = T['length'] extends 0 | 1 | 2
? T
: T extends [infer _, ...infer R, infer __]
? GetMiddleElement<R>
: never;
Solution by JohnLi1999 #24688
// your answers
type GetMiddleElement<T extends unknown[]> = T extends [infer F,...infer M, infer L]
? M extends []
? [F,L]
: GetMiddleElement<M>
: T
Solution by studymachiney #24682
type GetMiddleElement<T extends any[]> = T extends [any, ...infer R, any] ? R extends [] ? T : GetMiddleElement<R> : T;
// old way
// type GetMiddleElement<T extends any[]> = T extends [] | [any] | [any, any] ? T :
// (T extends [any, ...infer R] ? //[->,...]
// (R extends [...infer RR, any] ? GetMiddleElement<RR> : T) : //[...,<-]
// T);
Solution by E-uler #24518
// your answers
type GetMiddleElement<T extends unknown[]> = T extends [infer F,...infer M, infer L] ?
M extends [] ?[F,L] : GetMiddleElement<M> : T
Solution by snakeUni #23330
// 你的答案
type GetMiddleElement<T extends unknown[] = []> = T['length'] extends 2 | 1
? T
: T extends [infer L, ...infer M, infer R]
? GetMiddleElement<M>
: []
Solution by aloneWang #23051
// 你的答案
type GetMiddleElement<T> = T extends [unknown, infer Head, ...infer Tail, unknown] ? GetMiddleElement<[Head, ...Tail]> : T
Solution by jxhhdx #22754
type GetMiddleElement<T> = T extends [unknown, infer Head, ...infer Tail, unknown] ? GetMiddleElement<[Head, ...Tail]> : T
Solution by teamchong #22548
type GetMiddleElement<T extends unknown[]> = T extends [infer A,...infer B,infer C] ? B extends [] ?[A,C] : GetMiddleElement<B> : T
Solution by tororo00 #22445
type GetMiddleElement<T extends unknown[]> =
T extends [infer _A, infer B, ...infer C, infer _D]
? GetMiddleElement<[B, ...C]>
: T
Solution by drylint #22125
type GetMiddleElement<T extends any[]> =
T extends []
? []
: T['length'] extends 1
? T
: T['length'] extends 2
? T
: T extends [infer F, ...infer M, infer L]
?GetMiddleElement
Solution by amcguire704 #22061
type GetMiddleElement<T extends unknown[]> = T['length'] extends 0 | 1 | 2 ? T :
T extends [infer S, ...infer Next, infer E] ? GetMiddleElement<Next> : never;
Solution by Karamuto #21800