TypeScript 中的 interface 和 type 到底有什么区别?
type 和 interface 都可以定义对象,二者到底有何区别?
interface Person {
age: number
name: string
}
type Person = {
age: number
name: string
};
回复
1个回答
test
2024-06-20
1. type 可以声明基本类型,而 interface 不行
type
可以声明基本类型
type Count = number;
type Color = "Red" | "Blue";
interface
只能用来声明复杂类型(对象和函数)
2. 扩展时表现不同
- 扩展
interface
时,TS 将检查扩展的接口是否可以赋值给被扩展的接口。
interface A {
good(x: number): string;
bad(x: number): string;
}
interface B extends A {
good(x: string | number): string;
bad(x: number): number; // Interface 'B' incorrectly extends interface 'A'.
// Types of property 'bad' are incompatible.
// Type '(x: number) => number' is not assignable to type '(x: number) => string'.
// Type 'number' is not assignable to type 'string'.
}
- 但使用
交叉类型
时则不会出现这种情况。我们将上述代码中的接口改写成类型别名,把extends
换成交集运算符&
,TS 将尽其所能把扩展和被扩展的类型组合在一起,而不会抛出编译时错误。
type A = {
good(x: number): string;
bad(x: number): string;
};
type B = A & {
good(x: string | number): string;
bad(x: number): number;
};
// ok
3. 多次定义时表现不同
interface
多次的声明会合并。type
不能重复声明。
interface
可以定义多次,多次的声明会合并。
interface Point {
x: number;
}
interface Point {
y: number;
}
const point: Point = { x: 1 }; //error Property 'y' is missing in type '{ x: number; }' but required in type 'Point'.
const point: Point = { x: 1, y: 1 }; // ok
- 但是
type
如果定义多次,会报错。
type Point = {
x: number; //error Duplicate identifier 'A'.
};
type Point = {
y: number; //error Duplicate identifier 'A'.
};
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容