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 相关文章推荐
location.href 在IE6中不跳转的解决方法与推荐使用代码
Jul 08 Javascript
使用jQuery插件创建常规模态窗口登陆效果
Aug 23 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
Oct 23 Javascript
jQuery中bind与live的用法及区别小结
Jan 27 Javascript
jQuery使用getJSON方法获取json数据完整示例
Sep 13 Javascript
百度多文件异步上传控件webuploader基本用法解析
Nov 07 Javascript
详解jQuery简单的表单应用
Dec 16 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
Jan 11 Javascript
微信小程序 navbar实例详解
May 11 Javascript
vue实现组件之间传值功能示例
Jul 13 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
Aug 17 Javascript
javascript实现简易的计算器
Jan 17 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中使用循环实现的金字塔图形
2014/11/08 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
2016/03/21 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
Some tips of wmi scripting in jscript (1)
2007/04/03 Javascript
Javascript 继承机制实例
2009/08/12 Javascript
测试你的JS的掌握程度的代码
2009/12/09 Javascript
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
Js 刷新框架页的代码
2010/04/13 Javascript
通过判断JavaScript的版本实现执行不同的代码
2010/05/11 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
2013/04/02 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
2013/06/06 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
深入浅出分析javaScript中this用法
2015/05/09 Javascript
分享一个原生的JavaScript拖动方法
2016/09/25 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
[03:36]DOTA2完美大师赛coL战队趣味视频——我演你猜
2017/11/23 DOTA
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
Python写的Discuz7.2版faq.php注入漏洞工具
2014/08/06 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
2019/06/19 Python
Python中print函数简单使用总结
2019/08/05 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
python高阶函数map()和reduce()实例解析
2020/03/16 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
python 基于UDP协议套接字通信的实现
2021/01/22 Python
销售业务员岗位职责
2014/01/29 职场文书
食品采购员岗位职责
2014/04/14 职场文书
领导干部廉政自律承诺书
2014/05/26 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
幼儿园圣诞节活动总结
2015/05/06 职场文书
2016年寒假家长评语
2015/10/10 职场文书
python 进阶学习之python装饰器小结
2021/09/04 Python