타입 T를 받고 T가 튜플 타입인지 확인하는 IsTuple 타입을 구현하라
Implement a type IsTuple, which takes an input type T and returns whether T is tuple type.
type IsTuple<T> =
[T] extends [never]?false //1
:T extends any[]|readonly any[]? //2
number extends T['length']? //3
false
:true
:false
반례들을 막기 위해 일단 스파게티 코드로 구현시켰다
never를 확인하기 위해 1번 조건을 만들었고
T가 배열 타입인지 확인하기 위해 2번 조건을 만들었다. 이때, readonly 배열을 배열 타입이 아니라고 ts내에서 판단하기 때문에 readonly 배열도 조건에 추가하였다.
이후, tuple 타입은 length가 명확한 숫자 타입이기 때문에 3번 조건에서 T['length']가 number인지 확인했다(만약 T['length']가 명확한 숫자타입이면 {ex: number extends 1} 조건이 성립하지 않기 때문)
다른 풀이를 확인해보니
1번 조건에서 유니온 타입이 아닌유니온 타입이 아닌 readonly any[]로 구현해도 됨을 확인했다.
readonly 튜플은 튜플 내의 값을 바꿀 수 없도록 고정해놓은 튜플이다.
이때 readonly 튜플은 일반 튜플에 할당할 수 없다.
다만, 일반 튜플은 readonly 튜플에 할당 할 수 없다.
https://github.com/type-challenges/type-challenges/issues/4491
https://www.typescriptlang.org/docs/handbook/2/objects.html#readonly-tuple-types