Checking for `never`

1 min to read

Checking if some type is never may seem trivial, and one could write something like:

typescript
type IsNever<T> = T extends never ? true : false

Unfortunately, it’s not gonna work as you’d expect:

typescript
type A = IsNever<never> // nevertype B = IsNever<number> // falsetype C = IsNever<true> // falsetype D = IsNever<any> // boolean

Results are not only incorrect, but also strange. This is because union types automatically distribute in conditional types, and—since never is basically an empty union—when distribution happens there’s nothing to distribute over, so the conditional type simply resolves to never.

In order to fix this, you just need to enclose T and never in a tuple to limit type distribution:

typescript
type IsNever<T> = [T] extends [never] ? true : false type A = IsNever<never> // truetype B = IsNever<number> // falsetype C = IsNever<true> // falsetype D = IsNever<any> // false

Voilà!