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 相关文章推荐
fix-ie5.js扩展在IE5下不能使用的几个方法
Aug 20 Javascript
ExtJs 3.1 XmlTreeLoader Example Error
Feb 09 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
Dec 12 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
Nov 25 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
Aug 27 Javascript
jquery选择器简述
Aug 31 Javascript
js实现跨域的4种实用方法原理分析
Oct 29 Javascript
mockjs+vue页面直接展示数据的方法
Dec 19 Javascript
JSON基本语法及与JavaScript的异同实例分析
Jan 04 Javascript
微信小程序:数据存储、传值、取值详解
May 07 Javascript
使用ThinkJs搭建微信中控服务的实现方法
Aug 08 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
Aug 03 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
星际中的相关伤害
2020/03/04 星际争霸
dedecms后台验证码总提示错误的解决方法
2007/03/21 PHP
通过JQuery实现win8一样酷炫的动态磁贴效果(示例代码)
2013/07/13 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
基于Vuejs实现购物车功能
2016/08/02 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
2018/04/17 jQuery
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
2019/05/21 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
Python break语句详解
2014/03/11 Python
Python内置函数之filter map reduce介绍
2014/11/30 Python
Python之re操作方法(详解)
2017/06/14 Python
Python时间序列处理之ARIMA模型的使用讲解
2019/04/02 Python
Python中将两个或多个list合成一个list的方法小结
2019/05/12 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
施华洛世奇西班牙官网:SWAROVSKI西班牙
2019/06/06 全球购物
餐厅执行经理岗位职责范本
2014/02/26 职场文书
团队经理竞聘书
2014/03/31 职场文书
2014年党的群众路线教育实践活动总结
2014/04/25 职场文书
个人课题方案
2014/05/08 职场文书
学校班班通实施方案
2014/06/11 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
领导新年致辞2016
2015/07/29 职场文书
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js
教你如何用cmd快速登录服务器
2022/06/10 Servers