ts的interface和type区别

1. 场景

interface 是用来描述对象类型的结构,可以定义对象的属性名和属性值的类型,也可以定义函数类型。
interface User {
    name: string;
    age: number;
    sayHello(): void;
}
const user: User = {
    name: "",
    age: 2,
    sayHello() {...}
}

可以用这个User接口来定义一个满足这个结构的对象。
type 可以定义任何类型,不仅仅是对象类型,也可以定义基本类型、联合类型、交叉类型等。

type Age = number;
type Person = {
    name: string;
    age: Age;
}
const alice: Person = {
    name: "",
    age: 2
}

用 type 定义一个心的类型别名,然后用这个别名来定义一个对象

2. 区别

interface 和 type 的区别在于:

  • interface 只能定义对象类型,而 type 可以定义任何类型。 interface
  • 可以被合并(merge),如果多个同名接口存在,它们会被自动合并为一个接口,而 type 不行。 interface
  • 支持扩展(extends),可以扩展其他接口;而 type 不支持扩展。

使用场景:

  • 如果需要定义一个对象的类型,应该使用 interface 。
  • 如果需要定义一个联合类型、交叉类型等,或者需要定义一个类型别名,应该使用type 。
  • 如果需要对一个已有的类型进行扩展,或者需要合并多个同名接口,应该使用 interface 。

3. type的类型合并

type 可以定义类型别名,它们可以使用 & 运算符合并多个类型,生成一个新的类型。

type Person = {
    name: string;
    age: Age;
}
type Student = {
    id: number;
    course: string;
}
type CollegeStudent = Person & Student;

用 & 合并为一个type

4. interface 类型合并

interface Shape {
    y: number;
    x: number;
}
interface Rect extends Shape {
    width: number;
    height: number;
}
const rect: Rect = {...}

5. type和interface混合

骚操作将 type 和 interface 混合使用,竟然真的可以😂

type CrossScrollType = {
  children: JSX.Element
}

interface CrossScrollInterface {
  title: string;
}
type CrossScrollAll = CrossScrollType & CrossScrollInterface

6. 同名合并

interface:多个 同名的 interface 却是可以通过这种形式合并,但是定义的属性名冲突也会报错。
在这里插入图片描述

type CrossScrollType = {
  children: JSX.Element
}

interface CrossScrollInterface {
  title: string;
}
interface CrossScrollInterface {
  name: number;
}
type CrossScrollAll = CrossScrollType & CrossScrollInterface

type: 定义多个相同的type名就会直接爆红,页面也会报错。
在这里插入图片描述
所以只有interface 支持多个相同的interface名,type 会直接报错。
extends 可以将属性的类型进行收窄,比如从 string | number 变成 string。但声明合并不行,类型必须完全一致。

参考:知乎和掘金

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/461838.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 自动备份 mysql 脚本

这个脚本会将数据库备份为一个SQL文件,并将其保存在指定的目录中。 #!/bin/bash# MySQL配置 DB_USER"your_mysql_username" DB_PASS"your_mysql_password" DB_NAME"your_database_name" DB_HOST"localhost"# 备份目录 BAC…

力扣hot100:416.分割等和子集(组合/动态规划/STL问题)

组合数问题 我们思考一下,如果要把数组分割成两个子集,并且两个子集的元素和相等,是否等价于在数组中寻找若干个数使之和等于所有数的一半?是的! 因此我们可以想到,两种方式: ①回溯的方式找到t…

springboot275毕业就业信息管理系统的设计与实现

毕业就业信息管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装毕业就业信息管理系统软件…

安装jupyter报错:404 GET /static/notebook/4131.bundle.js

1、报错安装过程 我直接是pip install jupyter 进行的安装,如下,安装的版本是7.1.2 2、报错结果 运行jupyternotebook后报错:404 GET /static/notebook/4131.bundle.js (3bea7012d1534d70a935c3c193d9308d127.0.0.1) 5.70ms refererht…

SMART PLC 卷径计算(圈数检测+膜厚叠加法)

1、卷径计算(膜厚叠加+数值积分器应用博途PLC SCL代码) https://rxxw-control.blog.csdn.net/article/details/136719982https://rxxw-control.blog.csdn.net/article/details/1367199822、膜厚叠加法 https://rxxw-control.blog.csdn.net/article/details/128600466

关于前端打包加部署

1.首先输入命令 npm build 2.打包完成进入xshell,输入命令 tar -zcvf "da 20240315 登录.tar.gz" * 这个命令是在Linux或类Unix系统上使用的tar命令,用于创建一个名为 "da 20240315 登录.tar.gz" 的归档文件,其中包含…

皂液器问卷调查

媳妇非要买这种皂液器,来问问友友们有用过的帮忙识别一下是否是真的好用:皂液器问卷调查 4个题

代码随想录算法训练营第41天 | 01背包问题(二维+一维) ,416. 分割等和子集

动态规划章节理论基础: https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 01背包理论基础 链接:https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%…

C++初阶:模板初阶

目录 1. 模板的引入2. 函数模板与类模板2.1 函数模板2.2 模板调用方式2.3 函数模板与普通函数的调用优先性2.4 类模板2.5 类模板的构造函数,类模板声明与定义分离 1. 模板的引入 我们来看下面这几个函数: void swap(int& left, int& right) {int…

vuepress-theme-vdoing博客搭建教程

搭建流程 前言 这是笔者搭建个人博客所经历的流程,特附上笔记 笔者个人博客地址:沉梦听雨的编程指南 一、主题介绍 本博客使用的主题为:vuepress-theme-vdoing,相关介绍和使用方法可以参考该主题的官方文档 官方文档快速上手…

java线程池基础

目录 一、线程池基础概念1.1 什么是线程池?1.2 为什么要用线程池?1.3 线程池的工作原理 二、java中的线程池2.1 线程池真正实现类 ThreadPoolExecutor 2.1.2 构造器2.1.3 参数2.1.3.1 workQueue2.1.3.2 threadFactory2.1.3.3 handler 2.2 线程池的使用2.…

超详细解析:在执行一条SQL语句期间发生了什么?

目录 前言MySQL的执行流程Server层连接器查询缓存词法分析器预处理优化器执行器 引擎层具体流程为什么需要redologredolog的组成redolog如何提高性能?redo log与binlog区别 总结 前言 我们学习MySQL时,首先第一个接触到的就是SQL语句了,那么…

MD5算法:密码学中的传奇

title: MD5算法:密码学中的传奇 date: 2024/3/15 20:08:07 updated: 2024/3/15 20:08:07 tags: MD5起源算法原理安全分析优缺点比较技术改进示例代码应用趋势 MD5算法起源: MD5(Message Digest Algorithm 5)算法是由MIT的计算机…

Linux之shell条件测试

华子目录 用途基本语法格式示例 文件测试参数示例 整数测试作用操作符示例~:检查左侧内容是否匹配右侧的正则表达式 案例分析逻辑操作符符号示例 命令分隔符&>:不管成功与否,都将信息写进黑洞中 用途 为了能够正确处理shell程序运行过…

django开发流式格式后的在nginx的部署的记录

关键记录. django上传代码要导出配置 pip freeze > requirements.txt 这个很关键。后面部署直接读取的 关键记录. django上传代码要导出配置 pip freeze > requirements.txt 这个很关键。后面部署直接读取的 关键记录. django上传代码要导出配置 pip freeze > require…

Python 基础语法:基本数据类型(字典)

为什么这个基本的数据类型被称作字典呢?这个是因为字典这种基本数据类型的一些行为和我们日常的查字典过程非常相似。 通过汉语字典查找汉字,首先需要确定这个汉字的首字母,然后再通过这个首字母找到我们所想要的汉字。这个过程其实就代表了…

Unity的AssetBundle资源运行内存管理的再次深入思考

大家好,我是阿赵。   这篇文章我想写了很久,是关于Unity项目使用AssetBundle加载资源时的内存管理的。这篇文章不会分享代码,只是分享思路,思路不一定正确,欢迎讨论。   对于Unity引擎的资源内存管理,我…

调皮的String及多种玩法(下部)

👨‍💻作者简介:👨🏻‍🎓告别,今天 📔高质量专栏 :☕java趣味之旅 欢迎🙏点赞🗣️评论📥收藏💓关注 💖衷心的希…

0101插入排序-算法基础-算法导论第三版

文章目录 一 插入排序二 循环不变式与插入排序的正确性三 伪代码中的一些约定四 Java代码实现插入排序结语 一 插入排序 输入: n n n个数订单一个序列 ( a 1 , a 2 , ⋯ , a n ) (a_1,a_2,\cdots,a_n) (a1​,a2​,⋯,an​). **输出:**输入序列的一个排…

【how2j练习题】HTML部分综合练习

练习题 1 <html><h1>英雄联盟 &#xff08;电子竞技类游戏&#xff09;</h1> <p> <strong>《英雄联盟》</strong>&#xff08;简称lol&#xff09;是由美国<i>Riot Games</i>开发&#xff0c;中国大陆地区由腾讯游戏运营的网络…