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
JQuery选择器绑定事件及修改内容的方法
Jan 23 Javascript
jQuery插件Validate实现自定义校验结果样式
Jan 18 Javascript
JS获取子窗口中返回的数据实现方法
May 28 Javascript
bootstrap提示标签、提示框实现代码
Dec 28 Javascript
jquery实现焦点轮播效果
Feb 23 Javascript
详解windows下vue-cli及webpack 构建网站(三)使用组件
Jun 17 Javascript
关于express与koa的使用对比详解
Jan 25 Javascript
jQuery层叠选择器用法实例分析
Jun 28 jQuery
微信小程序中的列表切换功能实例代码详解
Jun 09 Javascript
基于javascript实现移动端轮播图效果
Dec 21 Javascript
前端vue+express实现文件的上传下载示例
Feb 18 Vue.js
使用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 什么是PEAR?(第二篇)
2009/03/19 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
laravel 解决Validator使用中出现的问题
2019/10/25 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
根据对象的某一属性进行排序的js代码(如:name,age)
2010/08/10 Javascript
JS实现的省份级联实例代码
2013/06/24 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
13个PHP函数超实用
2015/10/21 Javascript
Jquery获取当前城市的天气信息
2016/08/05 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
jquery购物车结算功能实现方法
2020/10/29 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
JavaScript 详解预编译原理
2017/01/22 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
React数据传递之组件内部通信的方法
2017/12/31 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
JS获取指定月份的天数两种实现方法
2018/06/22 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
Django集成百度富文本编辑器uEditor攻略
2014/07/04 Python
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
彻底理解Python list切片原理
2017/10/27 Python
Python随机函数random()使用方法小结
2018/04/29 Python
python3安装OCR识别库tesserocr过程图解
2020/04/02 Python
Python3+selenium配置常见报错解决方案
2020/08/28 Python
苹果中国官方网站:Apple中国
2016/07/22 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
计算机通信专业推荐信
2014/02/22 职场文书
团队拓展活动总结
2014/08/27 职场文书
2014年话务员工作总结
2014/11/19 职场文书
2015年初中教师个人工作总结
2015/07/21 职场文书
《唯一的听众》教学反思
2016/02/18 职场文书