【TS高频面试题】interface与type的区别

参考文章

一、基本概念

1. type(类型别名)

用来给一个类型起新名字,使用 type 创建类型别名。

2. interface(接口)

专门用于定义对象的结构(比如属性和方法)

二、相同点

(1)都可以描述对象或函数

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;

(2)都允许继承

在 TypeScript 中,interface 和 type 可以相互继承。
在 TypeScript 中,interfacetype 可以相互继承,具体如下:

1. interface 可以继承 interface

这是最常见的用法。一个 interface 可以通过 extends 继承另一个 interface

interface Person {
  name: string;
}

interface Employee extends Person {
  employeeId: number;
}

const emp: Employee = {
  name: "Alice",
  employeeId: 123
};

2. interface 可以继承 type

interface 也可以通过 extends 继承一个 type,因为 type 也可以定义对象结构。

type Person = {
  name: string;
};

interface Employee extends Person {
  employeeId: number;
}

const emp: Employee = {
  name: "Bob",
  employeeId: 456
};

3. type 可以继承 interface

type 可以通过交叉类型(&)继承 interface。交叉类型会将多个类型合并为一个新类型。

interface Person {
  name: string;
}

type Employee = Person & {
  employeeId: number;
};

const emp: Employee = {
  name: "Charlie",
  employeeId: 789
};

4. type 可以继承 type

type 可以通过交叉类型继承另一个 type

type Person = {
  name: string;
};

type Employee = Person & {
  employeeId: number;
};

const emp: Employee = {
  name: "David",
  employeeId: 101
};
  • interface 可以继承 interfacetype,通过 extends 实现。
  • type 可以继承 interfacetype,通过交叉类型 & 实现。

三、区别

(1) 可声明的类型

type:不仅可以用来表示对象类型,还可以用来表示基本类型联合类型元组和交叉类型

type userName = string;   // 基本类型
type userMsg = string | number;   // 联合类型
 
// 对象类型
type Person = {
    name: userName;
    age: number;
};
 
// 使用Person类型
let user: Person = {
    name: "leo",
    age: 18
};


//  交叉类型 例子:
// 交叉类型将多个类型组合成一个类型,这个类型必须满足所有被组合的类型。对于复杂对象或组合类型的场景非常有用。
type Person = {
  name: string;
  age: number;
};

type Employee = {
  employeeId: number;
  position: string;
};

type Developer = Person & Employee; // 交叉类型

const dev: Developer = {
  name: "Alice",
  age: 28,
  employeeId: 123,
  position: "Frontend Developer"
};

interface:仅限于描述对象类型和函数

interface User {
  name: string;
  age: number;
  sayHello: () => void;
}

const user1: User = {
  name: "Alice",
  age: 25,
  sayHello: () => console.log("Hello!")
};

(2)interface支持声明合并,type不支持会报错

或者总结成:

  • type 可以做到而 interface 不能做到:可以用来表示基本类型联合类型元组和交叉类型
  • interface 可以做到而 type 不能做到:interface 可以声明合并。如果使用type,就会报 重复定义 的警告
interface test {
    name: string
}
interface test {
    age: number
}
    
/*
    test实际为 {
        name: string
        age: number
    }
*/

(3)扩展(继承)的的实现方法

interface是通过extends实现的,type是通过&(交叉类型)实现的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值