TypeScript strongly types arrays, and defines tuples to handle aggregates of heterogeneous objects. JavaScript objects are strongly typed with interfaces according to their shapes, that is, to their properties and methods. Interfaces are used also to strongly type indexable types and functions.
The intersection and union of types allows TypeScript to retain the flexibility of JavaScript, without reverting to strong typing. Type guards and discriminated unions simplify the usage of unions, avoiding the usage of too many type assertions. Indeed, type guards and discriminated unions factor out a type assertion to a whole block of code.
The destructuring and spread operators introduced in ECMAScript 6 simplify both the construction of complex entities, and the extraction of information from such complex entities.
Finally, TypeScript adds both strong typing and overloads to...