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
.
Комментарии