When learning TypeScript it can seem verbose and confusing—if applied to the extreme. Take for instance a simple add
function...
In JavaScript:
function add(x, y) {
return x + y;
};
// or as function expression
let add = function (x, y) {
return x + y;
};
// or with ES6 fat-arrow
let add = (x, y) => x + y;
In TypeScript, one could define types in several ways:
function add(x: number, y: number): number {
return x + y;
};
// or as function expression (type inferred on the _left_ operand)
let add = function (x: number, y: number): number {
return x + y;
};
// or as function expression (type inferred on the _right_ operand)
let add: (x: number, y: number) => number = function (x, y) {
return x + y;
};
// or as function expression (explicitly and somewhat redundantly)
let add: (x: number, y: number) => number = function (x: number, y: number): number {
return x + y;
};
// or with ES6 fat-arrow (inference on left)
let add = (x: number, y: number): number => x + y;
// or with ES6 fat-arrow (inference on right)
let add: (x: number, y: number) => number = (x, y) => x + y;
// or with ES6 fat-arrow (😳)
let add: (x: number, y: number) => number = (x: number, y: number): number => x + y;
Yikes! And that's with a really simple, pure function!
But really, we could narrow the types (by using const
) and also let TS infer as much as possible:
function add(x: number, y: number) {
return x + y;
};
// Inferred type is function add(x: number, y: number): number
const add = (x: number, y: number) => x + y;
// Inferred type is let add: (x: number, y: number) => number
All the same type safety, but with minimal verbosity! FTW.
Top comments (0)