# 类型别名

接口类型的一个作用是将内联类型抽离出来,从而实现类型可复用。

其实,我们也可以使用类型别名接收抽离出来的内联类型实现复用。

格式:type 别名名称 = 类型定义。

type FnType = { name: string; age: number & 20 };
let fn: FnType = {
  name: "张三",
  age: 20,
};
console.log(fn); // { name: '张三', age: 20 }

# 特定使用场景

大家可能觉得这个和接口没多大区别,这不是重复了吗?

其实不是,类型别名可以针对接口没法覆盖的场景,例如组合类型、交叉类型等;

// 1. 组合类型
type NumAndString = number | string;

let a: NumAndString = 10;
a = "su";

// 2. 交叉类型
type SectionType = { name: string; age: number } & {
  height: number;
  name: string;
};

let person: SectionType = {
  name: "张三",
  age: 20,
  height: 180,
};
console.log(person); // { name: '张三', age: 20, height: 180 }

// 3. 提取接口属性类型
interface PersonInfo {
  name: string;
  height: number;
}

type PersonHeight = PersonInfo["height"];

let zs: PersonHeight = 175;

// 黑魔法 vscode提示字面类型都被保留
type BorderColor = "black" | "red" | "green" | "yellow" | "blue" | (string & {}); 

let color: BorderColor = "black";
color = "12";

# Interface 与 Type 的区别

实际上,在大多数的情况下使用接口类型和类型别名的效果等价,但是在某些特定的场景下这两者还是存在很大区别。

  1. 重复定义的接口类型,它的属性会叠加,这个特性使得我们可以极其方便地对全局变量、第三方库的类型做扩展
  2. 如果我们重复定义类型别名,那么就会报错
  3. 类型别名 直接支持交叉类型和联合类型 ,接口不支持