interface和type被TS设计出来,是完全不同的东西,有各自的职责。
interface用来定义对象类型,可以对对象的形状进行描述。type用来给类型起一个新的别名。它并不是一个类型,只是一个别名。类型别名可以让TS编写更简洁清晰。
相同点
都可以用来描述对象或函数。
type Point = {x: number;y: number;};type SetPoint = (x: number, y: number) => void;
interface Point {x: number;y: number;}interface SetPoint {(x: number, y: number): void;}
都支持扩展。
type Animal = {name: string;};type Bear = Animal & {honey: boolean;};
type Animal = {name: string;};interface Bear extends Animal {honey: boolean;}
interface Animal {name: string;}interface Bear extends Animal {honey: boolean;}
interface Animal {name: string;}type Bear = Animal & {honey: boolean;};
不同点
类型别名可以为基本类型、联合类型、元组定义别名,接口不行。
type Num = number;type ID = string | number;type Point = [number, number];
同名接口会自动合并,而类型别名不会。
interface User {name: string;}interface User {age: number;}let user: User = {name: "zhang",age: 18,};
type User = {name: string;}// 报错,标识符User重复type User = {age: number;}
适用场景
接口适用场景
- 定义基本数据类型的别名
- 定义元组类型
- 定义函数类型
- 定义联合类型
- 定义映射类型
类型别名适用场景
- 定义对象类型(包括属性、方法)
- 利用接口合并特性时
