type 和 interface 傻傻分不清楚?

大家好,我是若川。持续组织了8个月源码共读活动,感兴趣的可以 点此加我微信ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外:目前建有江西|湖南|湖北籍前端群,可加我微信进群。


阿宝哥精心准备的《轻松学 TypeScript》 视频教程已经更新到第十二期了,通过形象生动的动画,让你轻松搞懂 TypeScript 的难点和核心知识点!

如果你简历上的技能有写 TypeScript,那么面试官可能会问你 type 和 interface 之间有什么区别?你知道怎么回答这个问题么?如果不知道的话,那看完本文也许你就懂了。

类型别名 type 可以用来给一个类型起个新名字,当命名基本类型或联合类型等非对象类型时非常有用:

type MyNumber = number;
type StringOrNumber = string | number;
type Text = string | string[];
type Point = [number, number];
type Callback = (data: string) => void;

在 TypeScript 1.6 版本,类型别名开始支持泛型。我们工作中常用的 Partial、Required、Pick、Record 和 Exclude 等工具类型都是以 type 方式来定义的。

// lib.es5.d.ts
type Partial<T> = {[P in keyof T]?: T[P];
};type Required<T> = {[P in keyof T]-?: T[P];
};type Pick<T, K extends keyof T> = {[P in K]: T[P];
};type Record<K extends keyof any, T> = {[P in K]: T;
};type Exclude<T, U> = T extends U ? never : T;

而接口 interface 只能用于定义对象类型,Vue 3 中的 App 对象就是使用 interface 来定义的:

// packages/runtime-core/src/apiCreateApp.ts
export interface App<HostElement = any> {version: stringconfig: AppConfiguse(plugin: Plugin, ...options: any[]): thismixin(mixin: ComponentOptions): thiscomponent(name: string): Component | undefined // Gettercomponent(name: string, component: Component): this // Setterdirective(name: string): Directive | undefineddirective(name: string, directive: Directive): this
}

由以上代码可知,在定义接口时,我们可以同时声明对象类型上的属性和方法。了解 type 和 interface 的作用之后,我们先来介绍一下它们的相似之处。

1、类型别名和接口都可以用来描述对象或函数

类型别名

type Point = {x: number;y: number;
};type SetPoint = (x: number, y: number) => void;

在以上代码中,我们通过 type 关键字为对象字面量类型和函数类型分别取了一个别名,从而方便在其他地方使用这些类型。

接口

interface Point {x: number;y: number;
}interface SetPoint {(x: number, y: number): void;
}

2、类型别名和接口都支持扩展

类型别名通过 &(交叉运算符)来扩展,而接口通过 extends 的方式来扩展。

类型别名扩展

type Animal = {name: string
}type Bear = Animal & { honey: boolean 
}const bear: Bear = getBear() 
bear.name
bear.honey

接口扩展

interface Animal {name: string
}interface Bear extends Animal {honey: boolean
}

此外,接口也可以通过 extends 来扩展类型别名定义的类型:

type Animal = {name: string
}interface Bear extends Animal {honey: boolean
}

同样,类型别名也可以通过 &(交叉运算符)来扩展已定义的接口类型:

interface Animal {name: string
}type Bear = Animal & { honey: boolean 
}

了解完 type 和 interface 的相似之处之后,接下来我们来介绍它们之间的区别。

1、类型别名可以为基本类型、联合类型或元组类型定义别名,而接口不行

type MyNumber = number;
type StringOrNumber = string | number;
type Point = [number, number];

2、同名接口会自动合并,而类型别名不会

同名接口合并

interface User {name: string;
}interface User {id: number;
}let user: User = { id: 666, name: "阿宝哥" };
user.id; // 666
user.name; // "阿宝哥"

同名类型别名会冲突

type User = {name: string;
};// 标识符“User”重复。ts(2300)
type User = { //Errorid: number;
};

利用同名接口自动合并的特性,在开发第三方库的时候,我们就可以为使用者提供更好的安全保障。比如 webext-bridge 这个库,使用 interface 定义了 ProtocolMap 接口,从而让使用者可自由地扩展 ProtocolMap 接口。

之后,在利用该库内部提供的 onMessage 函数监听自定义消息时,我们就可以推断出不同消息对应的消息体类型。

扩展 ProtocolMap 接口

import { ProtocolWithReturn } from 'webext-bridge'declare module 'webext-bridge' {export interface ProtocolMap {foo: { title: string }bar: ProtocolWithReturn<CustomDataType, CustomReturnType>}
}

监听自定义消息

import { onMessage } from 'webext-bridge'onMessage('foo', ({ data }) => {// type of `data` will be `{ title: string }`console.log(data.title)
}

390ddf2e02ee659b0f8d268b70558d93.png

如果你感兴趣的话,可以看一下该项目的源码。若遇到问题,可以跟阿宝哥交流。最后我们来总结一下类型别名和接口的一些使用场景。

使用类型别名的场景:

  • 定义基本类型的别名时,使用 type

  • 定义元组类型时,使用 type

  • 定义函数类型时,使用 type

  • 定义联合类型时,使用 type

  • 定义映射类型时,使用 type

使用接口的场景:

  • 需要利用接口自动合并特性的时候,使用 interface

  • 定义对象类型且无需使用 type 的时候,使用 interface

d0901952532b9381ca9f618bcc3b0c48.gif

················· 若川简介 ·················

你好,我是若川,毕业于江西高校。现在是一名前端开发“工程师”。写有《学习源码整体架构系列》20余篇,在知乎、掘金收获超百万阅读。
从2014年起,每年都会写一篇年度总结,已经坚持写了8年,点击查看年度总结。
同时,最近组织了源码共读活动,帮助4000+前端人学会看源码。公众号愿景:帮助5年内前端人走向前列。

4d3f8e671d34af66a4d64129c64adf2b.png

扫码加我微信 ruochuan02、拉你进源码共读

今日话题

目前建有江西|湖南|湖北 籍 前端群,想进群的可以加我微信 ruochuan12 进群。分享、收藏、点赞、在看我的文章就是对我最大的支持~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上帝公式_感谢上帝的空白

上帝公式Do you ever walk into a room cluttered with discarded papers and leftover takeout and feel comfortable?您是否曾经走进过乱七八糟的房间&#xff1f; Yes, you might if you’re a sophomore at college. That’s just dorm life. Back in the late 90’s to …

figma下载_在Figma上进行原型制作的各种触发选项

figma下载Prototypes are model versions of digital products. They’re used to measure usability by testing with potential users of a product. When making prototypes with Figma, it is necessary that the actions that trigger reactions aren’t strangers and th…

通过动画让你深入理解 ES modules

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以 点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

海量数据处理之倒排索引

前言&#xff1a;本文是对博文http://blog.csdn.net/v_july_v/article/details/7085669的总结和引用 一&#xff0c;什么是倒排索引 问题描述&#xff1a;文档检索系统&#xff0c;查询那些文件包含了某单词&#xff0c;比如常见的学术论文的关键字搜索。 基本原理及要点&#…

ux和ui_如何为您的UX / UI设计选择正确的原型制作工具

ux和uiAll UX/UI designers might encounter the situation of creating prototypes for wireframes or visual designs. In some cases, you may also receive the need to craft motion designs, for instance, animating icons or illustrations.所有UX / UI设计人员都可能遇…

Vue 性能指标逐渐开始反超 React 了!

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以 点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

figma下载_我如何使用Figma,CSS Grid和CSS Flexbox构建登录页面

figma下载I enjoy looking at website designs that are on platforms like Behance, Dribble, etc. as they are visually very pleasing to the eye. While scrolling through these designs, I always wonder about one thing, that is, how difficult would it be to expre…

2022年Web平台的新动态

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以 点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

【逃离一线】被裁后的面经与感慨

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以 点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

使命召唤ios_使命召唤的精巧UI:战地

使命召唤iosWith over 50 million players worldwide it’s safe to say Warzone has become a global sensation. Featuring cross-platform play, multiple game modes, customisation and wealth of features too long to mention here — it’s captured its audience and …

深入浅出 package.json,目测大多数人不了解它

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以 点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

鲸鱼网络连接_登陆鲸鱼:在网络上读书,第1部分

鲸鱼网络连接I don’t know when it was I started using the text of Moby Dick in my workshops and talks. Likely it dates back to some of my earliest explorations of web typography. Since it’s out of copyright, it’s one those texts you can find online in va…

2022年值得使用的 Node.js 框架

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以 点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

更改apk安装包对android系统等级要求

此篇文章解决的为问题: █问题1.系统等级与apk等级不匹配. █问题2.更改api等级后的签名问题. 1.工具准备: 解压缩tool.zip文件夹: 2.开始反编译apk安装包 3.切换目录到tool目录下: 4.反编译: apktool.bat d 待编译apk目录名 存放编译后的文件目录 apktool.bat d Onenote_v14.…

推荐一个前端技术选型神器!真好用~

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以 点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

静态原型设计 加载中_见解1:原型设计有助于填补静态设计留下的空白。

静态原型设计 加载中In April 2015, I joined the Disney Parks creative team to design mobile experiences for the happiest place on Earth. I learned a lot from a diverse group of humble, creative, and smart people.2015年4月&#xff0c;我加入了迪士尼公园创意团…

最优资产组合步骤_重新设计投资组合网站之前,请按照以下5个步骤进行操作

最优资产组合步骤The portfolio website is one of the most important assets for a designer. Without it, it can be tough to find your next job or client.作品集网站是设计师最重要的资产之一。 没有它&#xff0c;很难找到下一份工作或客户。 The temptation is high …

裁员潮之下,13次面试拿下字节前端岗offer!

|前言很多粉丝私信&#xff0c;这两个月求职没有往年那么好跳&#xff0c;还有不少粉丝已经收到公司的“优化”通知下面分享一位粉丝的最近的面试经历&#xff0c;在疫情裁员潮的环境下&#xff0c;经历了成长、膨胀、闭关打磨等一系列的跌宕起伏&#xff0c;最终拿下字节总包5…

hdu 1754/zstu 3121 I Hate It(线段树)

http://acm.hdu.edu.cn/showproblem.php?pid1754 http://acm.zstu.edu.cn:8080/JudgeOnline/showproblem?problem_id3121 &#xff08;1&#xff09;线段树的基本操作&#xff1a;建树&#xff0c;查询&#xff0c;更新。 &#xff08;2&#xff09;重新写一遍时&#xff0c;…

sketch放入app组件_使用Sketch App设计CSS网格

sketch放入app组件首先定义您的网格 (Start by defining your grid) Sketch has 2 built-in layout features — Layout and Grid. In most cases, layout is a great way to organize content on a typical website utilizing a 12 column grid. However for this exercise we…