IsNever
Проблема
Реализовать тип IsNever<T>, который принимает тип T. Если тип T это
never, вернуть true, иначе false. Например:
type A = IsNever<never>; // expected to be true
type B = IsNever<undefined>; // expected to be false
type C = IsNever<null>; // expected to be false
type D = IsNever<[]>; // expected to be false
type E = IsNever<number>; // expected to be false
Решение
Решение в лоб - проверить, можно ли присвоить тип T к never с помощью
условных типов. Если T присваиваемый к never, возвращаем true, иначе
false.
type IsNever<T> = T extends never ? true : false;
К сожалению, не проходим тест с never. Почему?
Тип never представляет из себя тип значений, которые никогда не должны
случиться. Тип never это подтип каждого типа в TypeScript, а значит, можно
присвоить never к каждому типу. Но, нету ни одного типа, который был бы
подтипом never, а значит, ничего нельзя присвоить к never (кроме самого
never).
Это приводит к другой проблеме. Как можно проверить, что тип T присваиваемый к
never, если мы не можем присваивать к never?
Давайте создадим новый тип с never внутри, почему нет? Что если, мы будем
проверять что тип T присваиваемый не к самому never, а к кортежу с never
внутри? В таком случае, формально, мы не будем пытаться присвоить каждый тип к
never.
type IsNever<T> = [T] extends [never] ? true : false;
С таким костылем, хаком, креативным решением, называйте как хотите; мы
реализовали тип, который может проверить, является ли T типом never.
Комментарии