TypeScript 中的 interface 和 type 到底有什么区别?

作者站长头像
站长
· 阅读数 9

type 和 interface 都可以定义对象,二者到底有何区别?

interface Person {
    age: number
    name: string
}

type Person = {
    age: number
    name: string
};
回复
1个回答
avatar
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'.
};
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容