当前位置: 首页 > article >正文

【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是通过&(交叉类型)实现的。


http://www.kler.cn/a/292463.html

相关文章:

  • Molecular signatures database (MSigDB) 3.0
  • 基于yolov8、yolov5的车型检测识别系统(含UI界面、训练好的模型、Python代码、数据集)
  • Javascript高级—常见算法
  • 在esxi8.0中安装黑群晖的过程记录及小问题处理
  • 越南很火的slots游戏投放Google谷歌广告策略
  • 排序算法 -快速排序
  • 【原创】java+springboot+mysql企业产品销售管理系统设计与实现
  • 空间数据库
  • 新书分享|ChatGLM3大模型本地化部署、应用开发与微调(附PDF)
  • 打卡第五十七天:prim与kruskal算法
  • 人生苦短我用Python excel转csv
  • 麒麟安全加固工具,为系统打造坚固“金钟罩”!
  • 微软云技术深度解析与代码使用案例
  • Python 人脸识别实战教程
  • Qt:玩转QPainter后转之太极图(步骤详细、包含源码)
  • 软件开发专用术语介绍
  • HTML元素拓展:data-*属性的应用与实践
  • 国产芯片LT6911UXE/C:HDMI 2.0转MIPI DSI/CSI转换器,4K超清
  • 【数据结构-二维前缀和】【列维护优化】力扣3212. 统计 X 和 Y 频数相等的子矩阵数量
  • EmguCV学习笔记 VB.Net 9.2 VideoWriter类
  • 谷歌seo网址如何快速被收录?
  • 大模型笔记01--基于ollama和open-webui快速部署chatgpt
  • 13.5 Files类操作梳理(下)
  • docker 启动ElasticSearch
  • uniapp组件知识记录
  • 数据赋能(192)——开发:数据服务——影响因素、直接作用、主要特征