본문 바로가기

FE/type-challenge

4484. IsTuple

728x90

문제

Implement a type IsTuple, which takes an input type T and returns whether T is tuple type.

type case1 = IsTuple<[number]> // true
type case2 = IsTuple<readonly [number]> // true
type case3 = IsTuple<number[]> // false

cases

type cases = [
  Expect<Equal<IsTuple<[]>, true>>,
  Expect<Equal<IsTuple<[number]>, true>>,
  Expect<Equal<IsTuple<readonly [1]>, true>>,
  Expect<Equal<IsTuple<{ length: 1 }>, false>>,
  Expect<Equal<IsTuple<number[]>, false>>,
  Expect<Equal<IsTuple<never>, false>>,
]

문제 링크

 

풀이

조건

  1. never 인 경우 false 여야 한다.
  2. 튜플이 아닌 경우 false 여야 한다.
  3. array인 경우 false 여야 한다.
  4. readonly tuple는 true여야 한다.

정답

type IsTuple<T> = [T] extends [never]
  ? false
  : T extends readonly any[]
    ? number extends T['length']
      ? false
      : true
    : false

해설

never 를 우선 필터링한다.

type IsTuple<T> = [T] extends [never] ? false : true

배열 제외한 다른 타입들을 필터링한다.

type IsTuple<T> = [T] extends [never] ? false : T extends any[] ? true : false

튜플과 배열을 구분하기 위해서 “length” 키워드를 사용한다. 튜플의 경우 length 가 Exact number 인 반면에, 배열의 경우는 number 타입이다. 따라서 이를 이용해서 array를 필터링한다.

type IsTuple<T> = [T] extends [never]
  ? false
  : T extends any[]
    ? number extends T['length']
      ? false
      : true
    : false

readonly를 추가한다.

type IsTuple<T> = [T] extends [never]
  ? false
  : T extends readonly any[]
    ? number extends T['length']
      ? false
      : true
    : false

혹시나 오류나 개선사항에 대한 피드백이 있으시면 댓글 부탁드리겠습니다.

728x90

'FE > type-challenge' 카테고리의 다른 글

5153. IndexOf  (0) 2023.08.17
5140. trunc  (0) 2023.08.16
5117. Without  (0) 2023.08.15
4803. TrimRight  (0) 2023.08.14
4471. Zip  (0) 2023.08.07