IsAny
any 타입인지 판단하는 IsAny 타입도 만들어보겠습니다.
type IsAny<T> = string extends (number & T) ? true : false;
생각했던 코드와 전혀 다른 코드인가요? 기본적으로 string과 number는 겹치지 않아서 extends할 수가 없습니다. 또한, number & T는 number의 부분집합이므로 더욱 string과 겹치지 않습니다. 하지만 T가 any라면 이야기가 달라집니다. number & any는 any이고, string은 any를 extends할 수 있게 됩니다. 따라서 T가 any일 때만 true이므로 any인지 아닌지를 판단하는 역할을 할 수 있습니다.
IsArray
이번에는 배열인지 판단하는 IsArray 타입입니다.
type IsArray<T> = IsNever<T> extends true
? false
: T extends readonly unknown[]
? IsAny<T> extends true
? false
: true
: false;