TS
什么是typeScript
ts是以js为基础构造出来的语言
可以说ts是js的升级版
- 它对JS进行了扩展,向JS中引入了类型的概念,并添加了许多新的特性。
- TS代码需要通过编译器编译为JS,然后再交由JS解析器执行。
- TS完全兼容JS,换言之,任何的JS代码都可以直接当成JS使用。
- 相较于JS而言,TS拥有了静态类型,更加严格的语法,更强大的功能;TS可以在代码执行前就完成代码的检查,减小了运行时异常的出现的几率;TS代码可以编译为任意版本的JS代码,可有效解决不同JS运行环境的兼容问题;同样的功能,TS的代码量要大于JS,但由于TS的代码结构更加清晰,变量类型更加明确,在后期代码的维护中TS却远远胜于JS。
TypeScript 开发环境搭建
在搭建环境之前 我们必须有Node.js
这里我把下载地址附上
. 下载Node.js
- 64位:https://nodejs.org/dist/v14.15.1/node-v14.15.1-x64.msi
- 32位:https://nodejs.org/dist/v14.15.1/node-v14.15.1-x86.msi
. 安装Node.js
node建议下载稳定版
下完以后
输入:npm i -g typescript
此处使用yarn也可以
命令为 yarn global add typescript
然后我们输入 tsc -v
查看安装是否成功
我们新建一个文件夹来书写ts文件
然后使用终端 tsc + 你的ts文件名
系统会自动给我们转化为js文件
自动编译
自动编译的命令为 tsc --watch
我们在终端输入后
js就会更具我们ts 的变化而变化
错误不自动更新
命令行输入 tsc --noEmitOnError --watch
基本类型
TS的一个重要特点
就算需要类型声明
简单的说 就是
声明一个变量 在赋值之前
需要通过类型声明来指定TS中的变量类型(参数和形参也属于变量)
这里的变量类型指的是以下类型
指定类型之后 ts编译器会自动判断我们声明变量的值是否符合声明 的类型 是则赋值 不是则报错
简单的说
类型声明给变量设置了什么类型 变量就必须是什么类型
- TS拥有自动的类型判断机制
- 当对变量的声明和赋值是同时进行的,TS编译器会自动判断变量的类型
- 所以如果你的变量的声明和赋值时同时进行的,可以省略掉类型声明
数组类型
数组类型和js相比比较特殊
我们需要在赋值前声明数组内的元素是什么数据类型
他有以下两种写法
写法1
写法2
联合类型
联合类型就像即又
比如说一个数组中 既有数字类型 又有 字符串类型
如下所示
中间使用一个 | 符号隔开
当我们作用于数组时
类型别名
当一个复杂类型或者联合类型过多或者被频繁使用时,可以通过类型别名来简化该类型的使用
函数类型
除了变量,我们常见的类型指定还有针对函数的类型声明
函数类型需要指的是 函数参数和返回值的类型,这里分为两种写法
方法一
单独指定参数返回值的类型
方法2
同时指定参数和返回值
这里要用到上文中的类型别名
void类型
当我们的函数没有返回值的时候
可以用关键词 void
函数可选参数
当我们定义函数时,有的参数可传可不传,这种情况下,可以使用 TS 的可选参数来指定类型
比如我们数组的方法
我们这边一slice方法为例
这边附上slice方法简介
参数可以直接使用或者传入两个
简单的说 就算参数不是必要的
这时候 我们就要用到符号 ?
我们以代码呈现
这里需要注意的是
可选参数只能出现在参数列表的最后, 即必须参数必须在可选参数之前
对象类型
js中的对象类型是属性和方法组成的
而ts中对象类型是对象中属性和方法的描述
属性采用属性名:类型形式
函数可以采用 方法名(): 返回值类型 或者 函数名: Function(不指定返回值)的形式
使用类型别名
直接使用{}会降低代码可读性,不具有辨识度,更推荐使用类型别名添加对象类型
接口interface
当一个对象类型被多次使用时,一般使用接口(interface)描述对象的类型,达到复用的目的
我们使用interface关键字来声明接口
接口名称推荐以I为开头
声明接口之后,直接使用接口名称作为变量的类型
接口与自定义类型的区别
共同点: 都是用来给对象指定类型
不同点: 接口只能为对象指定类型, 类型别名可以为任意类型指定别名
推荐用 type(自定义类型) 来定义
接口的继承
我们这里使用extends来进行继承
这里我们两个接口都有xy
这时候我们可以让point3d继承point2d
降级编译
在这里更改target降级编译
值为es的版本
一般用来兼容旧版本
类型断言
有时候你会比 TS 更加明确一个值的类型,此时,可以使用类型断言来指定更具体的类型
所谓断言就是断定、确定、绝对的意思;所以简单来讲,类型断言就是保证数据类型一定是所要求的类型
使用 as 关键字实现类型断言
关键字 as 后面的类型是一个更加具体的类型(HTMLAnchorElement 是 HTMLElement 的子类型)
通过类型断言,aLink 的类型变得更加具体,这样就可以访问 a 标签特有的属性或方法了
数据的类型断言
从上我们可以得知
类型断言通过as关键字 断言为一个差不多的类型 或者 更加具体的类型
但是如果直接断言则会报错
我们要先给我们的数据 定义一个类型
unknown 代表任意安全的any(any代表所有类型)
文字类型
这里我们解释以下ts的类型
变量1的类型是 string
变量2的类型是‘李四’
我们这么理解
str1 是一个变量(let),它的值可以是任意字符串,所以类型为:string
str2 是一个常量(const),它的值不能变化只能是 ‘张三’,所以,它的类型为:‘张三’
这里 str2常量的 “李四” 就算一个字面量类型
就是某个特殊的字符串也可以作为TS中的类型
任意的 JS 字面量(对象,数组,数字)都可以作为类型使用
枚举
ts特有功能
枚举的功能类似于字面量类型+联合类型组合的功能
也可以表示一组明确的可选择
简单的说
枚举定义一组命名常量 他描述一个值
这个值可以是这些命名常量中的一个
我们通过enum关键字来创建一个枚举
数字枚举
这里我们需要知道一点
枚举成员是有值的,默认为:从 0 开始自增的数值
字符串枚举
字符串枚举指的是枚举成员是字符串
这里需要注意的是
字符串枚举没有自增
所以字符串枚举必须每个成员都有初始值
枚举的实现原理
枚举是 TS 为数不多的非 JavaScript 类型级扩展(不仅仅是类型)的特性之一
因为:其他类型仅仅被当做类型,而枚举不仅用作类型,还提供值(枚举成员都是有值的)
也就是说,其他的类型会在编译为 JS 代码时自动移除。但是,枚举类型会被编译为 JS 代码
如下所示
ts中我们写的
接下来我们看看js转译的
一般情况下,推荐使用字面量类型+联合类型组合的方式,因为相比枚举,这种方式更加直观、简洁、高效
typeof
typeof是用来获取数据类型
实际上,TS 也提供了 typeof 操作符:可以在类型上下文中引用变量或属性的类型(类型查询)
使用场景:根据已有变量的值,获取该值的类型,来简化类型书写
案例如下