Union types allow a value to hold one of several types, and checks narrow the current type.

Union Narrowing

union.ts
let input: number | string = ;

let value: number;
if (typeof input === "string") {
    value = Number(input);
    console.log(`parsed ${input}`);
} else {
    value = input;
    console.log(`used number ${input}`);
}

const doubled: number = value * 2;
console.log(`doubled=${doubled}`);
let input: number | string = ;

let value: number;
if (typeof input === "string") {
    value = Number(input);
    console.log(`parsed ${input}`);
} else {
    value = input;
    console.log(`used number ${input}`);
}

const doubled: number = value * 2;
console.log(`doubled=${doubled}`);
let input: number | string = ;

let value: number;
if (typeof input === "string") {
    value = Number(input);
    console.log(`parsed ${input}`);
} else {
    value = input;
    console.log(`used number ${input}`);
}

const doubled: number = value * 2;
console.log(`doubled=${doubled}`);
union type A union such as `number | string` accepts either type until a check narrows the value.