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>>,
]
풀이
조건
- never 인 경우 false 여야 한다.
- 튜플이 아닌 경우 false 여야 한다.
- array인 경우 false 여야 한다.
- 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 |