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;
}
适用场景
接口适用场景
- 定义基本数据类型的别名
- 定义元组类型
- 定义函数类型
- 定义联合类型
- 定义映射类型
类型别名适用场景
- 定义对象类型(包括属性、方法)
- 利用接口合并特性时