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刷新页面的实现代码(局部及全页面刷新)
Jul 11 Javascript
javascript自然分类法算法实现代码
Oct 11 Javascript
在Node.js应用中使用Redis的方法简介
Jun 24 Javascript
理解 JavaScript Scoping &amp; Hoisting(二)
Nov 18 Javascript
CSS中position属性之fixed实现div居中
Dec 14 Javascript
javascript计时器编写过程与实现方法
Feb 29 Javascript
原生JS和jQuery版实现文件上传功能
Apr 18 Javascript
canvas滤镜效果实现代码
Feb 06 Javascript
vue.js过滤器+ajax实现事件监听及后台php数据交互实例
May 22 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
Aug 14 Javascript
js实现随机点名器精简版
Jun 29 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
Jul 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
Memcache 在PHP中的使用技巧
2010/02/08 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
php如何连接sql server
2015/10/16 PHP
PHP使用内置函数生成图片的方法详解
2016/05/09 PHP
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
Javascript 日期处理之时区问题
2009/10/08 Javascript
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
JQuery onload、ready概念介绍及使用方法
2013/04/27 Javascript
node.js中的console.warn方法使用说明
2014/12/09 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
2015/04/06 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
详解Vue用axios发送post请求自动set cookie
2017/05/10 Javascript
vue.js配合$.post从后台获取数据简单demo分享
2018/08/11 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
JavaScript基础之this和箭头函数详析
2019/09/05 Javascript
H5实现手机拍照和选择上传功能
2019/12/18 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
2020/02/03 Javascript
vue实现图书管理系统
2020/12/29 Vue.js
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
python局部赋值的规则
2013/03/07 Python
python实现m3u8格式转换为mp4视频格式
2018/02/28 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
2020/09/09 Python
python 实现有道翻译功能
2021/02/26 Python
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
教学质量评估实施方案
2014/03/17 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
详解JAVA的控制语句
2021/11/11 Java/Android