面试官: TS 中 interface 与 type 异同点?

205 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

官方文档

An interface can be named in an extends or implements clause, but a type alias for an object type literal cannot.

An interface can have multiple merged declarations, but a type alias for an object type literal cannot.

意会有困难?我们往下看~

相同点

都可以描述一个对象或者函数

interface

interface User {
  name: string
  age: number
}

interface SetUser {
  (name: string, age: number): void;
}

type

type User = {
  name: string
  age: number
};

type SetUser = (name: string, age: number): void;

不同点

1. 拓展(extends)与 交叉类型(Intersection Types):

interface 可以 extends, 但 type 是不允许 extendsimplement 的,但是type可以通过交叉类型实现extend的类型扩展行为。即 interface 可以 extends type, type 也可以 与 interface 类型 交叉 。

二者对类型的扩展方法不同,但可以相互兼容使用。对 type 的类型扩展,并不叫 extend 而是类型合并。type 关键字的产生的东西官方有一个名字 type aliases ,就是类型别名,重点是它是别名不是而真正的类型

四种实现:

interface extends interface

interface Name { 
  name: string; 
}
interface User extends Name { 
  age: number; 
}

interface extends type

type Name = { 
  name: string; 
}
interface User extends Name { 
  age: number; 
}

type 与 type 交叉

type Name = { 
  name: string; 
}
type User = Name & { age: number  };

type 与 interface 交叉

interface Name { 
  name: string; 
}
type User = Name & { 
  age: number; 
}

2. type 可以干的而 interface 不行:

type 可以声明基本类型别名联合类型元组等类型

// 基本类型别名
type Name = string

// 联合类型
interface Dog {
    wong();
}
interface Cat {
    miao();
}

type Pet = Dog | Cat

// 具体定义数组每个位置的类型
type PetList = [Dog, Pet]

type 语句中还可以使用 typeof 获取实例的 类型进行赋值

// 当你想获取一个变量的类型时,使用 typeof
let div = document.createElement('div');
type B = typeof div

3. interface 可以而 type 不行:

interface 能够合并声明

interface User {
  name: string
  age: number
}

interface User {
  sex: string
}

/*
User 接口为 {
  name: string
  age: number
  sex: string 
}
*/

总结一下

两者都是为了告诉编译器,如何理解某个字段的结构类型:

  • interface 是一种关系结构的描述,里面可以包含属性和方法,可派生。
  • type 是一种表达式,所以也可以说是一种aliase,可以使用一些表达式的操作符,并且通过这些操作符实现和interface近似等价的关系描述。
  • 在对象扩展情况下,interface 使用 extends 关键字,而 type 使用交叉类型(&)。
  • 同名的 interface 会自动合并,并且在合并时会要求兼容原接口的结构。
  • interface 与 type 都可以描述对象类型、函数类型、Class 类型,但 interface 无法像 type 那样表达元组、一组联合类型等等。
  • interface 无法使用映射类型等类型工具,也就意味着在类型编程场景中我们应该使用 type 。

参考:

林不渡 TypeScript 全面进阶指南

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

httpweixin.qq.comr5RGXj2jETTUyrSzs90T3.png

来源:前端妙妙屋 - 前端开发者的学习资源