Union Types#

Think of types as sets. A type is a set in which certain values can inhabit.

never#

There is an inhabitable type called never. No value exists on the type never, which means an identifier typed as never cannot possibly be assigned any value:

let n: never;
let s: never;
let o: never;
let a: never;

n = 1;
s = "Hello!";
o = { id: 1, skill: "The Force" };
a = [1, 2, 3];

The last four lines are all errors.

The type never is the empty set ∅.

Unions with the empty set ∅#

If we concatenate a “z” with an empty string “”, we get “z”, right? (the empty string amounts to nothing). If we have a union of string | never (the empty set ∅), we end up with string (the empty set ∅ also amounts to nothing). Examples:

type T = string | never
// → string

type U = number | never;
// → number

type V = string | string[] | never;
// → string | string[]

type W = Record<string, number> | never;
// → { [k: string]: number }

In all of the above cases, the type never (the empty set ∅) is not part of the resulting type (not part of the set).

Union of some type and any#

Since string is a subtype of any (any is a top type which includes all other types), having a union of string | any results in simply any:

type T = string | any;
type U = number | any;
type V = Array<[number, string]> | any;

T, U and V are all of the type any.