Typescript 中的 interface 和 type 到底有什么区别详解


Posted in Javascript onJune 18, 2019

interface VS type

大家使用 typescript 总会使用到 interface 和 type,官方规范 稍微说了下两者的区别

  • An interface can be named in an extends or implements clause, but a type alias for an object type literal cannot.
  • An interface can have multiple merged declarations, but a type alias for an object type literal cannot.

但是没有太具体的例子。

明人不说暗话,直接上区别。

相同点

都可以描述一个对象或者函数

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;

都允许拓展(extends)

interface 和 type 都可以拓展,并且两者并不是相互独立的,也就是说 interface 可以 extends type, type 也可以 extends interface 。 虽然效果差不多,但是两者语法不同。

interface extends interface

interface Name { 
 name: string; 
}
interface User extends Name { 
 age: number; 
}

type extends type

type Name = { 
 name: string; 
}
type User = Name & { age: number };

interface extends type

type Name = { 
 name: string; 
}
interface User extends Name { 
 age: number; 
}

type extends interface

interface Name { 
 name: string; 
}
type User = Name & { 
 age: number; 
}

不同点

type 可以而 interface 不行

type 可以声明基本类型别名,联合类型,元组等类型

// 基本类型别名
type Name = string

// 联合类型
interface Dog {
 wong();
}
interface Cat {
 miao();
}

type Pet = Dog | Cat

// 具体定义数组每个位置的类型
type PetList = [Dog, Pet]

type 语句中还可以使用 typeof 获取实例的 类型进行赋值

// 当你想获取一个变量的类型时,使用 typeof
let div = document.createElement('div');
type B = typeof div

其他骚操作

type StringOrNumber = string | number; 
type Text = string | { text: string }; 
type NameLookup = Dictionary<string, Person>; 
type Callback<T> = (data: T) => void; 
type Pair<T> = [T, T]; 
type Coordinates = Pair<number>; 
type Tree<T> = T | { left: Tree<T>, right: Tree<T> };

interface 可以而 type 不行

interface 能够声明合并

interface User {
 name: string
 age: number
}

interface User {
 sex: string
}

/*
User 接口为 {
 name: string
 age: number
 sex: string 
}
*/

总结

一般来说,如果不清楚什么时候用interface/type,能用 interface 实现,就用 interface , 如果不能就用 type 。其他更多详情参看 官方规范文档

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一个很简单的办法实现TD的加亮效果.
Jun 29 Javascript
javascript json 新手入门文档
Dec 03 Javascript
javascript 另一种图片滚动切换效果思路
Apr 20 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
Sep 02 Javascript
js动态创建标签示例代码
Jun 09 Javascript
详解JavaScript中的forEach()方法的使用
Jun 08 Javascript
javascript如何操作HTML下拉列表标签
Aug 20 Javascript
分享19个JavaScript 有用的简写写法
Jul 07 Javascript
webpack学习教程之前端性能优化总结
Dec 05 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
Oct 12 Javascript
node.js的Express服务器基本使用教程
Jan 09 Javascript
Vue中CSS动画原理的实现
Feb 13 Javascript
使用js在layui中实现上传图片压缩
Jun 18 #Javascript
jquery中为什么能用$操作
Jun 18 #jQuery
详解Vue3.0 前的 TypeScript 最佳入门实践
Jun 18 #Javascript
利用js-cookie实现前端设置缓存数据定时失效
Jun 18 #Javascript
vue中利用Promise封装jsonp并调取数据
Jun 18 #Javascript
实用Javascript调试技巧分享(小结)
Jun 18 #Javascript
Angular中innerHTML标签的样式不起作用的原因解析
Jun 18 #Javascript
You might like
解析php中heredoc的使用方法
2013/06/17 PHP
YII2.0之Activeform表单组件用法实例
2016/01/09 PHP
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
PHP编写daemon process 实例详解
2016/11/13 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
js获取变量
2006/08/24 Javascript
javawscript 三级菜单的实现原理
2009/07/01 Javascript
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
jQuery事件绑定on()、bind()与delegate() 方法详解
2015/06/03 Javascript
利用JS生成博文目录及CSS定制博客
2016/02/10 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
javascript实现简易计算器
2017/02/01 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
详解10分钟学会vue滚动行为
2017/09/21 Javascript
Vue基础学习之项目整合及优化
2019/06/02 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
微信小程序保存图片到相册权限设置
2020/04/09 Javascript
[46:16]2018DOTA2亚洲邀请赛3月30日 小组赛B组 iG VS VP
2018/03/31 DOTA
Python中enumerate()函数编写更Pythonic的循环
2018/03/06 Python
python实现自动发送报警监控邮件
2018/06/21 Python
python实现简易数码时钟
2021/02/19 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
python实现人脸签到系统
2020/04/13 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
html5 canvas实现圆形时钟代码分享
2013/12/25 HTML / CSS
一年级数学教学反思
2014/02/01 职场文书
劲霸男装广告词
2014/03/21 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
语文教育专业求职信
2014/06/28 职场文书