this

在 TypeScript 里可以规定 this 参数的类型。

以下代码示例规定 this 为某个接口。

interface Human{}
fn(this: Human){}

重载

重载有点像泛型。以下是重载与泛型的对比:

function add(n1: number, n2: number);
function add(n1: string, n2: string);
function add(n1, n2) {
  return n1 + n2;
}

function add2<T>(n1: T, n2: T): T {
  return n1;
}

add(1, 2); // 3
add("frank", "jack"); // 'frankjack'

add2(new Date(), new Date());

类型推断

TypeScript 是聪明的,TypeScript 编译器会自动识别出类型。

function add(n1: string,n2: string) {
  return n1 + n2 ;
}
add('a','b')  // 编译器会推断出为 string

类型兼容

即使对象的属性比接口多,下列代码也能跑。这种方法可以避免多写接口。

interface Human {
  name: string;
  age: number;
}
let y = {name:'xxx',age:18,gender:'yyy'}
let x: Human = y

soundness

很多语言都不 sound 的,包括 TypeScript。TypeScript 只求在正确性和效率性取得平衡,所以它的设计上不求完备。