TS 系列 - 类型别名与接口

110 阅读1分钟

类型别名

所有的类型都可以用类型别名表示
语法:type typeName = typeValue

// 给联合类型重新命名
type NS = number | string;

// 创建一个新的对象类型
type Person = { name: string, age: number };

接口

接口只能用来命名对象类型
语法:interface typeName {}

声明普通对象类型

interface Animal {
  age: number;
}

声明函数类型

interface Fn {
  (name: string): string;
}

let fn: Fn = function (name: string): string {
  return name;
}

类型别名和接口的区别

  1. 接口可以声明同一名称的类型,但类型别名不能
  2. 接口在声明同一名称的类型时,会发生类型合并,但类型别名不能
  3. 接口针对的是对象类型的声明,而类型别名支持所有类型的声明
  4. 接口可以被继承,而类型别名无法被继承
// 接口可以声明同一名称的类型,但类型别名不能
// 接口在声明同一名称的类型时,会发生类型合并,但类型别名不能
interface Animal {
  name: string;
}

interface Animal {
  age: number;
}

let dog: Animal = {
  name: "dog",
  age: 10
}

type Dog = {
  name: string;
}

type Dog = {
  name: string;
} // Error: Duplicate identifier 'Dog'.

// 接口可以被继承,而类型别名无法被继承
interface Pen {
  name: string;
}

interface Pencil extends Pen {
  color: string;
}