In most programming languages a variable has a type and that type does not change. But one of the most interesting aspects of TypeScript's type system is that a symbol has a type at a location. Various control flow constructs can change this type: function refine(x: string | number) { // type of x is string | number here if (typeof x === 'number') { // type of x is number here. } else { // type of