likes
comments
collection
share

面试官:来说一下 interface 和 type 的区别吧

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

前言

在问到 ts 相关的知识点时,常常会把 InterfaceType 拿来比较。

之所以把两者进行比较,是因为它们都可以用来定义对象的形状,这种功能上的重叠使得开发者在选择使用哪一个时容易产生疑问。

两者在语法上具有一定的相似性,特别是在定义对象的属性时。

interface Person { name: string; age: number; }
type PersonType = { name: string; age: number; };

而在关于 ts 的问题中,可以说这个问题是必问的了,还不清楚的小伙伴抓紧看看吧!

1. 语法

type 可以使用别名或联合/交叉类型来定义,而 interface 则用来定义对象的属性时。

// type 别名
type PersonType = {
  name: string;
  age: number;
};

// type 联合类型
type IDType = string | number;

// interface
interface Person {
  name: string;
  age: number;
}

2. 扩展

interface 可以通过扩展来继承另一个 interface,type 别名不能继承,只能通过交叉类型来组合。

interface 扩展

// interface 扩展
interface Animal {
  name: string;
}

interface Bear extends Animal {
  honey: boolean;
}

const bear: Bear = {
  name: "Winnie",
  honey: true,
};

type 组合

type Animal = {
  name: string;
};

type Bear = Animal & {
  honey: boolean;
};

const bear: Bear = {
  name: "Winnie",
  honey: true,
};

3. 合并

多个相同名称的 interface 会自动合并,但同名的 type 别名会报错。

interface 合并

// interface 合并
interface Box {
  height: number;
}

interface Box {
  width: number;
}

const box: Box = {
  height: 10,
  width: 20, 
};

type 别名重复报错

type Box = {
  height: number;
};

type Box = { // 重复定义会报错
  width: number;
};

4. 对象字面量扩展

对象字面量可以通过扩展 interface 来添加新字段,但不能通过扩展 type 别名。

interface Box {
  height: number;
  width: number;
}

const square = {
  height: 10,
  width: 10,
} as Box;

const cube = {
  ...square,
  depth: 10, // 使用 interface 可以扩展
} as Box;

type BoxType = {
  height: number;
  width: number;
};

const square: BoxType = {
  height: 10,
  width: 10,
};

const cube = {
  ...square,
  depth: 10, // 无法扩展 type 别名
};

总结

当需要定义一个对象的属性时,interface 通常是首选,因为它更灵活、可扩展,并且具有自动合并的特性。

当需要创建可复用的类型别名、联合类型、交叉类型时,使用 type

在 ts 中适当使用两者,可以让代码更加清晰、可维护。

转载自:https://juejin.cn/post/7369165462569320485
评论
请登录