深入浅出TypeScript(4)- 使用接口和类型别名
在TypeScript中,为了可以约束对象定义,提供了两个新的特性,接口和类型别名。
TypeScript中的接口
在强类型语言中,都有接口的概念,那么TypeScript中的接口是如何使用的呢?
接口定义形式如下:
interface test {
name: string,
value: number
}
上述接口,定义了一个test接口,该接口可以约束两个字段的数据类型,分别是name和value。而接口的使用主要有三个方面:实现、继承和约束。
实现接口
通过用类来实现接口,就实现了接口约束类中必须定义的字段,实现接口的关键字是implements,接下来,我们定义一个类来实现上述接口:
class TestClass implements test {
name: string;
value: number;
}
如果类中缺少了属性name和value,就会报错,我们就可以用test接口来约束实现接口类中的属性。
继承接口
接口之间,还可以进行继承,用来使得该接口拥有被继承接口的属性和方法。比如有如下两个接口:
interface ColorInterface {
color: string;
} interface LineInterface {
width: number;
}
在上面我们定义了两个接口,分别表示颜色和线条的宽度,如果我们想要定义一条直线的类别,那么我们可以定义如下接口继承:
interface StrightLineInterface extends ColorInterface, LineInterface {
height: number
}
此时此刻,接口StrightLineInterface便拥有了color和width属性,TypeScript中类只能实现一个接口,但是接口可以通过继承实现多态。
接口约束
除了被实现和继承,接口还可以用来约束对象或者函数类型。
比如我们后台获取的数据需要遵循特定类型,我们才能使用,我们就可以用接口来约束我们获取的数据类型。
比如,我们获取的数据是一个包含id,name的对象数据,那么我们可以定义如下接口:
interface List {
id: number,
name: string,
age?: number, // 可选属性表示list中,可有可无的属性
} interface Result {
data: List
}
我们在使用result的时候,就可以用Result接口来约束它的格式:
function use(result: Result) {
result.data.map(x => {
// 操作代码
})
}
接口还可以约束可变参数的对象,可变参数就是我们不知道对象中有多少个属性,但是我们知道属性的类别,可以用如下方式约束:
interface NameArray {
[x: number]: string
}
该接口表示我们接受约束的对象必须是数字下标,而值必须是string类型的value对象。
除此之外,接口还可以约束函数:
interface Add {
(x: number, y: number): number
} let add: Add = (a, b) => a + b;
接口约束Props和State
接口还可以约束React中的Props和State的类型,如下所示:
interface Props {
name: string,
data: string[]
} interface State {
[x: string]: string
} class Comp extends React.Component<Props, State> {
// 第一个表示props的类型约束,第二个表示state的类型约束,如果没有props,我们可以设置为{}
}
类型别名
上面提到的接口可以做的一些事情,而类型别名,主要就是对对象或者函数起到约束作用,特性没有接口多。
type Add = (x: number, y: number) => number; let add: Add = (a, b) => a + b;
而类型别名是早起TypeScript做类型约束的主要形式,后来引入接口之后,TypeScript推荐我们尽可能的使用接口来规范我们的代码。
而两者也都是TSC编译器做类型判定的时候有作用,我们可以在playground里面看到,当我们写一个接口或者是一个类型别名定义一个对象或者方法的时候,并未有任何编译成的es5代码出现。
总结
这一小节主要讲述了类型别名和接口的用法,以及两者的区别。
TypeScript中,如果再相同功能点的顶一下,推荐使用interface去定义数据类型。
我的博客地址:http://www.gaoyunjiao.fun/?p=138
深入浅出TypeScript(4)- 使用接口和类型别名的更多相关文章
- typescript可索引接口 类类型接口
/* 接口的作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用.接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据, ...
- TypeScript type 类型别名
//6,类型别名 /**类型别名不能出现在声明右侧的任何地方. * 接口 vs. 类型别名 * 另一个重要区别是类型别名不能被extends和implements(自己也不能extends和imple ...
- Typescript中的可索引接口 类类型接口
/* 5.typeScript中的接口 可索引接口 类类型接口 */ /* 接口的作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用 ...
- TypeScript完全解读(26课时)_4.TypeScript完全解读-接口
4.TypeScript完全解读-接口 初始化tslint tslint --init:初始化完成后会生成tslint.json的文件 如果我们涉及到一些规则都会在这个rules里面进行配置 安装ts ...
- 深入浅出TypeScript(3)- 函数重载和泛型
面向对象特性中,最根本的就是面向对象的三大基本特征:封装.继承.多态.同时,TypeScript中也存在多态的使用,比如函数重载,今天我们先看一下函数重载以及泛型的概念. 什么是函数重载 简单来说,函 ...
- TypeScript:基本类型和接口
返回TypeScript手册总目录 基本类型(Basic Types) 为了让程序可以使用,我们需要用到一些最简单的数据单元:数字,字符串,结构,布尔值,诸如此类.在TypeScript中,支持许多正 ...
- mybatis中自建的类型别名
在使用mybatis过程中经常用到类型别名,除了我们自己新建的别名外,mybatis还自带了很多类型别名和java中的类型的映射,下面先看一个自建的别名的配置 <typeAliases> ...
- 浩哥解析MyBatis源码(八)——Type类型模块之TypeAliasRegistry(类型别名注册器)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6705769.html 1.回顾 前面几篇讲了数据源模块,这和之前的事务模块都是enviro ...
- typescript中的接口
说到接口:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用.接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心 ...
随机推荐
- 消息中间件——RabbitMQ(一)Windows/Linux环境搭建(完整版)
前言 最近在学习消息中间件--RabbitMQ,打算把这个学习过程记录下来.此章主要介绍环境搭建.此次主要是单机搭建(条件有限),包括在Windows.Linux环境下的搭建,以及RabbitMQ的监 ...
- Gunicorn-Django部署
1. 简单部署 1. sudo pip3 install gunicorn 2. cd 到django项目中 sudo python3 manage.py migrate 3.启动服务:sudo py ...
- istio入门教程
广告 | kubernetes各版本离线安装包 安装 安装k8s 强势插播广告 三步安装,不多说 安装helm, 推荐生产环境用helm安装,可以调参 release地址 如我使用的2.9.1版本 y ...
- Bootstrap笔记--快速入门
首先是Bootstrap的简介: 业余了解:下面这个网址可以查询IP地址的地理位置 下面学习:(具体可以参考Bootstrap中文网) 栅格系统 Bootstrap 提供了一套响应式.移动设备优先的流 ...
- 996工作制?不如花点时间学知识!北栀暗影教你如何用WordPress搭建专业网站
很多70后.80后小时候都看过这样一部动画片-<半夜鸡叫>.讲的是地主"周扒皮"为了长工们能多干些活,半夜三更起来学鸡叫让长工劳动(卖身契上规定:鸡叫就得起床干活劳动) ...
- Java源码之阻塞队列
⑴背景 阻塞队列常用于生产者消费者场景,生产者是向队列里添加元素的线程,消费者是向队列里取出元素的线程.阻塞队列的角色是供生产者存放元素,消费者取出元素的容器. ⑵阻塞队列 阻塞队列是一个支持两个附加 ...
- pycharm的补充
pycharm 快捷键 tab自动补全 首行缩进 ctrl+?是全行加#进行注释 ctrl+d 复制上一行 ctrl +z 撤销 ctrl+shift+z 撤销的撤销 更改字体大小
- zookeeper和dubbo安装与搭建
Zookeeper+Dubbo安装与搭建 (原创:黑小子-余) 本文有借鉴:https://www.cnblogs.com/UncleYong/p/10737119.html (一)zookeeper ...
- 还在用if else?策略模式了解一下!
在公司负责的就是订单取消业务,老系统中各种类型订单取消都是通过if else 判断不同的订单类型进行不同的逻辑.在经历老系统的折磨和产品需求的不断变更,决定进行一次大的重构:消灭 if else. 接 ...
- 强烈推荐 GitHub 上值得前端学习的开源实战项目
强烈推荐 GitHub 上值得前端学习的开源实战项目. Vue.js vue-element-admin 是一个后台前端解决方案,它基于和 element-ui 实现 基于 iView 的 Vue 2 ...