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 相关文章推荐
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
Nov 14 Javascript
jquery.cookie用法详细解析
Dec 18 Javascript
脚本合并提升javascript性能示例
Feb 24 Javascript
学习JavaScript设计模式(策略模式)
Nov 26 Javascript
js实现根据身份证号自动生成出生日期
Dec 15 Javascript
浅谈js中调用函数时加不加括号的问题
Jul 28 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
Sep 14 Javascript
Vue.js实现网格列表布局转换方法
Aug 25 Javascript
jquery中done和then的区别(详解)
Dec 19 jQuery
vue路由插件之vue-route
Jun 13 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
Sep 10 jQuery
JS实现简单省市二级联动
Nov 27 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
利用static实现表格的颜色隔行显示
2006/10/09 PHP
PHP与SQL注入攻击[二]
2007/04/17 PHP
PHP中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
PHP stripos()函数及注意事项的分析
2013/06/08 PHP
php实现将字符串按照指定距离进行分割的方法
2015/03/14 PHP
PHP结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
2016/07/27 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
vue2.0 实现导航守卫的具体用法(路由守卫)
2018/05/17 Javascript
JSON.stringify()方法讲解
2019/01/31 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
[01:50]WODOTA制作 DOTA2中文宣传片《HERO》
2013/04/28 DOTA
python利用datetime模块计算时间差
2015/08/04 Python
python 全文检索引擎详解
2017/04/25 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
python连接数据库的方法
2017/10/19 Python
python网络爬虫学习笔记(1)
2018/04/09 Python
python生成带有表格的图片实例
2019/02/03 Python
pandas计数 value_counts()的使用
2019/06/24 Python
python 实现客户端与服务端的通信
2020/12/23 Python
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
西班牙最大的婴儿用品网上商店:Bebitus
2019/05/30 全球购物
党风廉政建设责任书
2014/04/14 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
教师自查自纠工作情况报告
2014/10/29 职场文书
python爬虫之利用selenium模块自动登录CSDN
2021/04/22 Python
小程序实现悬浮按钮的全过程记录
2021/10/16 HTML / CSS
使用Django框架创建项目
2022/06/10 Python
MySQL控制流函数(-if ,elseif,else,case...when)
2022/07/07 MySQL