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 相关文章推荐
学习面向对象之面向对象的基本概念:对象和其他基本要素
Nov 30 Javascript
菜鸟javascript基础资料整理3 正则
Dec 06 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
Dec 13 Javascript
jQuery 中国省市两级联动选择附图
May 14 Javascript
JS 弹出层 定位至屏幕居中示例
May 21 Javascript
node.js中的path.dirname方法使用说明
Dec 09 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
Dec 19 Javascript
jQuery基于图层模仿五星星评价功能的方法
May 07 Javascript
jQuery原理系列-css选择器的简单实现
Jun 07 Javascript
详解JavaScript对象的深浅复制
Mar 30 Javascript
three.js实现3D模型展示的示例代码
Dec 31 Javascript
微信小程序实现简单评论功能
Nov 28 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中将时间差转换为字符串提示的实现代码
2011/08/08 PHP
一个简单且很好用的php分页类
2013/10/26 PHP
PHP实现的带超时功能get_headers函数
2015/02/10 PHP
php/JS实现的生成随机密码(验证码)功能示例
2019/06/06 PHP
jquery入门—访问DOM对象方法
2013/01/07 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
nodejs中使用HTTP分块响应和定时器示例代码
2017/03/19 NodeJs
jquery点赞功能实现代码 点个赞吧!
2020/05/29 jQuery
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
详解如何在react中搭建d3力导向图
2018/01/12 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
原生JavaScript实现随机点名表
2021/01/14 Javascript
python中快速进行多个字符替换的方法小结
2016/12/15 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
Python管理Windows服务小脚本
2018/03/12 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
2018/09/17 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
Python读取YAML文件过程详解
2019/12/30 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
以下的初始化有什么区别
2013/12/16 面试题
MIS软件工程师的面试题
2016/04/22 面试题
房地产还款计划书
2014/01/10 职场文书
四群教育工作实施方案
2014/03/26 职场文书
六年级学生期末评语
2014/12/26 职场文书
毕业生对母校寄语
2015/02/26 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
Spring Data JPA的Audit功能审计数据库的变更
2021/06/26 Java/Android
numpy array找出符合条件的数并赋值的示例代码
2022/06/01 Python