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