# 类型别名
接口类型的一个作用是将内联类型抽离出来,从而实现类型可复用。
其实,我们也可以使用类型别名接收抽离出来的内联类型实现复用。
格式: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 的区别
实际上,在大多数的情况下使用接口类型和类型别名的效果等价,但是在某些特定的场景下这两者还是存在很大区别。
- 重复定义的接口类型,它的属性会叠加,这个特性使得我们可以极其方便地对全局变量、第三方库的类型做扩展
- 如果我们重复定义类型别名,那么就会报错
- 类型别名 直接支持交叉类型和联合类型 ,接口不支持