IsNever
Challenge
Implement a type IsNever, which takes input type T.
If the type of resolves to never, return true, otherwise false.
For example:
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
Solution
Zur Lösung des Problems könnte man auf die Idee kommen, einfach folgendes zu prüfen:
type IsNever<T> = T extends never ? true : false;
Hiermit funktioniert allerdings ein Testfall nicht. Der Grund ist folgender:
IsNever wird hier als Distrubive Conditional Type angesehen, was soviel heißt wie: Wenn T eine Vereinigung ist, wird die Kondition für jedes Element der Vereinigung geprüft und das Ergebnis ist die Vereinigung aller dieser Teilergebnisse. Das Interessante ist nun, dass never in TypeScript als leere Verneinung abgebildet wird:
"a" | (never == "a"); // ergibt 'a'
Entsprechend kann der obere Typ nicht funktionieren, da dieser nie angewandt werden kann, denn never ist ja immer eine leere Vereinigung (und das Ergebnis somit never). In dem man die Distribution mittels einer Tupel verhindert, können die Werte verglichen werden:
type IsNever<T> = [T] extends [never] ? true : false;