Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >TypeScript 中 type 和 interface 有什么区别?

TypeScript 中 type 和 interface 有什么区别?

作者头像
前端西瓜哥
发布于 2022-12-21 11:40:38
发布于 2022-12-21 11:40:38
72400
代码可运行
举报
运行总次数:0
代码可运行

大家好,我是前端西瓜哥,今天我们来看看 type 和 interface 的区别。

type 和 interface

type 是 类型别名,给一些类型的组合起别名,这样能够更方便地在各个地方使用。

假设我们的业务中,id 可以为字符串或数字,那么我们可以定义这么一个名为 ID 的 type:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type ID = string | number;

定义一个名为 Circle 的对象结构 type:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Circle = {
  x: number;
  y: number;
  radius: number;
}

interface 是 接口。有点像 type,可以用来代表一种类型组合,但它范围更小一些,只能描述对象结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Position {
  x: number;
  y: number;
}

它们写法有一点区别,type 后面需要用 =,interface 后面不需要 =,直接就带上 {

范围

type 能表示的任何类型组合。

interface 只能表示对象结构的类型。

继承

interface 可以继承(extends)另一个 interface。

下面代码中,Rect 继承了 Shape 的属性,并在该基础上新增了 width 和 height 属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Shape {
 x: number;
  y: number;
}

// 继承扩展
interface Rect extends Shape {
  width: number;
  height: number;
}

const rect: Rect = { x: 0, y: 0, width: 0, height: 0 };

interface 也可以继承自 type,但只能是对象结构,或多个对象组成交叉类型(&)的 type

再来看看 type 的继承能力。

type 可以通过 & 的写法来继承 type 或 interface,得到一个交叉类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Shape = {
    x: number;
    y: number;
}

type Circle = Shape & { r: number }

const circle: Circle = { x: 0, y: 0, r: 8 }

声明合并

interface 支持声明合并,文件下多个同名的 interface,它们的属性会进行合并

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Point {
  x: number;
}

interface Point {
  y: number;
}

const point: Point = { x: 10, y: 30 };

需要注意的是,同名属性的不能进行类型覆盖修改,否则编译不通过。比如我先声明属性 x 类型为 number,然后你再声明属性 x 为 string | numebr,就像下面这样,编译器会报错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Point {
  x: number;
}

interface Point {
  // 报错
  // Property 'x' must be of type 'number', but here has type 'string | number'.
  x: string | number;
  y: number;
}

extends 可以将属性的类型进行收窄,比如从 string | number 变成 string。 但声明合并不行,类型必须完全一致。

type 不支持声明合并,一个作用域内不允许有多个同名 type

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 报错:Duplicate identifier 'Point'.
type Point = {
  x: number;
}

// 报错:Duplicate identifier 'Point'.
type Point = {
  y: number;
}

当然,如果有和 type 同名的 interface,也会报错。

结尾

总结一下,type 和 interface 的不同点有:

  1. type 后面有 =,interface 没有;
  2. type 可以描述任何类型组合,interface 只能描述对象结构;
  3. interface 可以继承自(extends)interface 或对象结构的 type。type 也可以通过 & 做对象结构的继承;
  4. 多次声明的同名 interface 会进行声明合并,type 则不允许多次声明;

大多数情况下,我更推荐使用 interface,因为它扩展起来会更方便,提示也更友好。& 真的很难用。

我是前端西瓜哥。欢迎关注我,学习更多前端知识。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端西瓜哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TypeScript Interface vs Type 知多少
接口和类型别名非常相似,在大多情况下二者可以互换。在写TS的时候,想必大家都问过自己这个问题,我到底应该用哪个呢?希望看完本文会给你一个答案。知道什么时候应该用哪个,首先应该了解二者之间的相同点和不同点,再做出选择。
五月君
2021/05/11
9180
使用 TypeScript 常见困惑:interface 和 type 的区别是什么?
当我们使用 TypeScript 时,就会用到 interface 和 type,平时感觉他们用法好像是一样的,没啥区别,都能很好的使用,所以也很少去真正的理解它们之间到底有啥区别。我们开发过经常或这么来定义类型:
前端小智@大迁世界
2022/06/15
9140
TS中type和interface在类型声明时的区别
在TS中interface 和 type都可以用来自定义数据类型,两者有许多相同之处,但是也有差别。我们一般选择 type 来定义基本类型别名、联合类型、元组等类型,而选择 interface 来定义复杂的对象、类、以及进行接口的继承。
不叫猫先生
2023/11/13
8940
TS中type和interface在类型声明时的区别
聊聊TypeScript类型声明那些最佳实践
TypeScript 诞生已久,优缺点大家都知晓,它可以说是JavaScript静态类型校验和语法增强的利器,为了更好的代码可读性和可维护性,我们一个个老工程都坦然接受了用TypeScript 重构的命运。然而在改造的过程中,逐步意识到TypeScript这门语言的艺术魅力
Jafeney
2021/07/19
1.6K0
让你更好使用 Typescript 的11个技巧
学习Typescript通常是一个重新发现的过程。最初印象可能很有欺骗性:这不就是一种注释Javascript 的方式吗,这样编译器就能帮助我找到潜在的bug?
前端小智@大迁世界
2023/01/10
1.1K0
Typescript常看常新
在看了同事推荐的ts教程后,发现自己还是有很多不会的,所以整理出一些自己学到的新知识点,希望各位也能有所收获!(我就写给自己看看,不要太当回事哈哈哈
y191024
2024/01/22
2660
Typescript常看常新
TypeScript基础知识
TypeScript是JavaScript的一个超集,支持ECMAScript6标准。
岳泽以
2022/11/22
2.3K0
TypeScript基础知识
从TypeScript到ArkTS迁移的保姆级指导
本文通过提供简洁的约束指导如何将标准的TypeScript代码重构为ArkTS代码。尽管ArkTS是基于TypeScript设计的,但出于性能考虑,一些TypeScript的特性被限制了。因此,在ArkTS中,所有的TypeScript特性被分成三类。
小帅聊鸿蒙
2024/07/07
9000
从TypeScript到ArkTS迁移的保姆级指导
接口_TypeScript笔记3
对于对象等复杂结构的类型,TypeScript的理念是鸭子类型(duck typing),即值的“形状”:
ayqy贾杰
2019/06/12
6450
TypeScript 在实际项目中的应用#2024年度实用技巧
从TypeScript诞生之初,我就有在关注学习,当时还写了两篇相关介绍文章,尽管那个时候的我并不确定这个所谓的JavaScrip超集,是否会跟其他前端新技术一样,大家追捧一阵,随后便迅速消失在无人关注的角落里,但这么多年过去了,我想它的重要性已经成为任何一个前端的必备技术了。
Nian糕
2025/01/26
1280
TypeScript 在实际项目中的应用#2024年度实用技巧
【TypeScript 4.5】006-第 6 章 对象类型
訾博ZiBo
2025/01/06
1350
TypeScript真香系列——接口篇
这对于我们之前在写 JavaScript 的时候,再正常不过了,但是如果这个 getUserInfo 在多人开发过程中,如果它是个公共函数,多个开发者都会调用,如果不是每个人点进来看函数对应注释,可能会出现以下问题:
coder_koala
2019/11/18
1K0
TypeScript进阶 之 重难点梳理
JavaScript 毋庸置疑是一门非常好的语言,但是其也有很多的弊端,其中不乏是作者设计之处留下的一些 “bug”。当然,瑕不掩瑜~
Nealyang
2020/03/25
4K0
TypeScript进阶 之 重难点梳理
Typescript真香秘笈
本文由 IMWeb 首发于 IMWeb 社区网站 imweb.io。点击阅读原文查看 IMWeb 社区更多精彩文章。 1. 前言 2018年Stack Overflow Developer的调研(https://insights.stackoverflow.com/survey/2018/)显示,TypeScript已经成为比JavaScript更受开发者喜爱的编程语言了。 之前我其实对于typescript没有太多好感,主要是认为其学习成本比较高,写起代码来还要多写很多类型声明,并且会受到静态类型检查
用户1097444
2022/06/29
5.8K0
Typescript真香秘笈
TS 从 0 到 1 - TypeScript 中的各种符号
! 后缀表达式可以用于断言操作对象是非 null 和非 undefined 类型。即 x!,将从 x 值域中排除 null 和 undefined。
Cellinlab
2023/05/17
1.6K0
一文读懂 TS 中 Object, object, {} 类型之间的区别
TypeScript 2.2 引入了被称为 object 类型的新类型,它用于表示非原始类型。在 JavaScript 中以下类型被视为原始类型:string、boolean、number、bigint、symbol、null 和 undefined。
阿宝哥
2020/04/08
18.3K0
初探 TypeScript函数基本类型泛型接口类内置对象
前段时间有朋友和我推荐 TypeScript ,他说写起来特别爽,让我去试一试,那时候我还在那是啥高深莫测的东西。刚好那段时间忙,一直没有时间看。最近也很忙,还是抽时间来探一探 TypeScript ;简单说 ts 主要提供的是 dynamic type check,提供的 interface 接口这个功能在开发项目的时候会很有帮助。TypeScript是 JavaScript 的一个超集。他和 JavaScript 有着千丝万缕的关系。
sunseekers
2018/10/31
7.4K0
TypeScript 中提升幸福感的 10 个高级技巧
通过 /** */ 形式的注释可以给 TS 类型做标记提示,编辑器会有更好的提示:
夜尽天明
2023/03/15
1K0
TypeScript 中提升幸福感的 10 个高级技巧
typescript
TypeScript是一种由微软开发的自由和开源的编程语言。它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。
一粒小麦
2019/07/18
2K0
typescript
15个用于开发的高级TypeScript技巧
可选链允许你安全地访问嵌套属性或方法,无需担心 null 或 undefined 值。如果任何中间属性为 null 或 undefined,它会立即终止评估。
前端小智@大迁世界
2023/08/16
3200
相关推荐
TypeScript Interface vs Type 知多少
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验