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 相关文章推荐
javascript 一个自定义长度的文本自动换行的函数
Aug 19 Javascript
一个XML格式数据转换为图表的例子
Feb 09 Javascript
加随机数引入脚本不让浏览器读取缓存
Sep 04 Javascript
JS实现单行文字不间断向上滚动的方法
Jan 29 Javascript
jquery获取url参数及url加参数的方法
Oct 26 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
Dec 22 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
Nov 05 Javascript
在Create React App中启用Sass和Less的方法示例
Jan 16 Javascript
JavaScript数据结构与算法之检索算法实例分析【顺序查找、最大最小值、自组织查询】
Feb 22 Javascript
Vue render函数实战之实现tabs选项卡组件
Apr 22 Javascript
JS实现可切换图片的幻灯切换效果示例
May 24 Javascript
浅析Vue中拆分视图层代码的5点建议
Aug 15 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
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
jquery Firefox3.5中操作select的问题
2009/07/10 Javascript
SlideView 图片滑动(扩展/收缩)展示效果
2010/08/01 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
2013/10/09 Javascript
Jquery实现遮罩层的方法
2015/06/08 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
微信小程序如何使用globalData的方法
2019/06/06 Javascript
vuex入门最详细整理
2020/03/04 Javascript
ES2020 已定稿,真实场景案例分析
2020/05/25 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
Python的词法分析与语法分析
2013/05/18 Python
使用Python设置tmpfs来加速项目的教程
2015/04/17 Python
Python2实现的LED大数字显示效果示例
2017/09/04 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
使用python画社交网络图实例代码
2019/07/10 Python
python视频按帧截取图片工具
2019/07/23 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
2020/09/21 Python
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
Optimalprint加拿大:在线打印服务
2020/04/03 全球购物
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
加工操作管理制度
2014/01/19 职场文书
卫生安全检查制度
2014/02/04 职场文书
政风行风评议整改方案
2014/09/15 职场文书
授权委托书范本(单位)
2014/09/28 职场文书
2015年护理工作总结范文
2015/04/03 职场文书
2015年秋学期教研工作总结
2015/10/14 职场文书
Python语言规范之Pylint的详细用法
2021/06/24 Python