FE/type-challenge

9896. GetMiddleElement

최토피 2023. 9. 12. 12:33
728x90

문제

Get the middle element of the array by implementing a GetMiddleElement method, represented by an array.

If the length of the array is odd, return the middle element If the length of the array is even, return the middle two elements
type simple1 = GetMiddleElement<[1, 2, 3, 4, 5]>, // expected to be [3]
type simple2 = GetMiddleElement<[1, 2, 3, 4, 5, 6]> // expected to be [3, 4]

cases

type cases = [
  Expect<Equal<GetMiddleElement<[]>, []>>,
  Expect<Equal<GetMiddleElement<[1, 2, 3, 4, 5]>, [3]>>,
  Expect<Equal<GetMiddleElement<[1, 2, 3, 4, 5, 6]>, [3, 4]>>,
  Expect<Equal<GetMiddleElement<[() => string]>, [() => string]>>,
  Expect<Equal<GetMiddleElement<[() => number, '3', [3, 4], 5]>, ['3', [3, 4]]>>,
  Expect<Equal<GetMiddleElement<[() => string, () => number]>, [() => string, () => number]>>,
  Expect<Equal<GetMiddleElement<[never]>, [never]>>,
]
// @ts-expect-error
type error = GetMiddleElement<1, 2, 3>

문제 링크

정답

type GetMiddleElement<T extends any[]> =
    T extends [unknown, ...infer Rest, unknown]
      ? Rest['length'] extends 0
        ? T
        : GetMiddleElement<Rest>
      : T

풀이

조건

  1. 입력 T의 가장 가운데 있는 수를 반환한다.
  1. T의 길이가 짝수인 경우 가운데 있는 두 개의 수를 반환한다.
  1. T가 배열이 아닌 경우 에러를 출력한다.

해설

T의 길이에 상관없이 가운데 수를 반환하기 위해서 재귀적으로 돌면서 양 끝의 항목들을 하나씩 제외하는 방식으로 구현한다.

type GetMiddleElement<T> =
    T extends [unknown, ...infer Rest, unknown]
      ? Rest['length'] extends 0
        ? T
        : GetMiddleElement<Rest>
      : T

조건 3처럼 에러를 출력하기 위해, T 에 조건을 추가한다.

type GetMiddleElement<T extends any[]>

 


오류나 개선점이 있다면 댓글 부탁드립니다.

728x90