上一节主要总结了Typescript
和JavaScript
之间的区别,以及Typescript
的运行环境。本节中我们主要对Typescript
的类型总结一下。
const message: string = "我是message"
var hello: string = "hhhh"
console.log(message)
console.log(hello)
如上述代码所示,我们声明变量,使用var/let/const 标识符: 变量类型 = 赋值。
此时如果我们给变量赋值为另一个类型的值,此时就会报错。
string(number)表示该数据为字符串类型或者数字类型,但是String(Number)则
表示该数据是一个类。
和ECMAscript一致,ts在声明变量时也是通过let / const / var 来进行声明。
上面声明message
变量并没有说明类型,但是在后面对message
进行赋值为数字类型的时候就会报错。当对message
进行赋值时,会将其赋值的类型设置为message
的类型,当将message
赋值为其他数据类型则就会报错。
我们经常所Typescript
是Javascript
的一个超级。
正如上图所示,Typescript
中相比于JavaScript
中多了接口,强类型,泛型等等。
Typescript
和Javascript
一样,其中不存在int
类型,double
类型的数据,只存在number
类型的数据,并且在typescript
中是支持二进制,八进制,十进制,十六进制
的。
字符串类型的数据可以是双引号,也可以是单引号。
也可以使用es6
中的模板字符串
写法
我们在js中喜欢往一个数组中存放不同的数据类型,但是在ts
中这样是不被允许的。ts
实现数组类型的有两种方式。
如上图所示,可以通过Array<string>
,也可以通过number[]
来设置数组。
当我们向该数组中插入一个其他类型的数据的时候,此时就会报错。
如上图所示,当我们设置给info
为object
类型的数据的时候,此时打印出info中的name属性
或者对name
属性进行赋值操作都会报错。
原因是我们在对info
设置为object
类型时,该类型中并不存在任何其他属性的类型。当读取info
中的name
属性时则会报错。解决方法:1、使用默认类型推断
如上图所示,此时如果我们不对其使用类型约束的话,此时就会是默认类型,然后默认类型中就存在name和age属性
,此时我们就可以读取其属性了。解决方法: 2、使用显示类型设置(type)
如上图所示,我们使用type
来设置类型,并将其作为info
的类型。
在es5
中如果我们的属性值相同,则该对象会报错,在ts中也是会报错的。
在ts
也可以使用Symbol
来解决属性名冲突的问题。
如上图所示,此时就不会报错。
null
和undefined
既是实际值,也是类型值。
如果我们无法确定数据的类型我们可以使用any
类型,如果我们使用any
类型,其实和js
一样。
我们可以对不同类型进行赋值操作。
如上述代码所示,如果我们给数组设置any
类型,此时该数组就可以存放任何数据类型。
unknown类型
表示类型不确定,从某种意义上来说,该类型的数据和any
类型数据差不多,但是和any
仍然存在一些不同。
上面这个例子中,我们对于result
类型不确定,因为在下面result
的值可能为string
类型也可能是 number
类型。当然我们也可以设置result
的类型为any
类型。但是我们一般还是使用unknown
类型。
原因是:unknown类型的数据只能赋值给any类型和unknown类型,但是any类型的数据可以赋值给任何类型的数据
。
正如上图所示,当我们将unknown类型的数据赋值给string类型时,会报错,但是any类型的数据不会。
void类型
的数据作为函数类型的返回值,并且函数的返回值为null
或者undefined
的时。
never类型表示永远不会发生值的类型
如上图所示,此时该函数中存在死循环,此时这个函数永远不会结束,此时不存在返回值,所以我们给函数的返回值为never
类型的值。
如上图所示,如果我们函数中存在报错,此时会返回never
类型的数据。
如上图所示,此时函数func1
中只允许传入number或者string类型的数据
,所以不可能经过default
分支,所以此时check
变量永远不可能发生值,此时其类型为never
类型。
很多语言中都存在元组类型的数据,例如python
等。在typescript
中也存在元组类型的数据的。
如果数据类型都相同的数据采用数据类型,数据类型不相同的采用元组类型。元组的简单使用
如图所示tuple的简单应用
,在react hooks
中的useState,执行后返回的是一个数组,数组中第一个元素是值
,另一个是函数
,此时可以使用元组。
如图所示在ts
中我们规定好函数参数类型,如果参数类型不一致,则报错。如果参数的数量不一致,则也会报错。
我们可以不规定函数的返回值类型,ts
会自定推断返回值类型。
上面为普通函数的参数,一般我们都需要加上类型注解,但是如果要是匿名函数的参数,比如说在forEach
中的匿名函数,此时就不需要类型注解,因为typescript
会根据所在上下文分析,得到item
的类型注解(因为数组arr
为字符串类型,此时item
就为字符串类型)。
如果我们存在一个参数为对象类型,我们可以如上述代码所示去设置参数类型。属性之间可以使用 , 或者 ; 来分割,最后一个分隔符是可选的。属性的类型也是可选的,如果没有设置类型,则默认类型为any
。
如果我们一些参数是可选的,可以在该参数后面加上?
表示可选,当传参时,有没有该属性都行。
联合类型表示:变量的类型可以为多种,如上述代码所示,message
的类型可以是number类型
,string类型
,boolean类型
。联合类型的使用
如上述代码所示,我们设置message
的类型为number,string, boolean类型
,并在函数中对其进行判断执行相关代码。
上面代码中我们匹配到message
为字符串时执行toUpperCase
操作,此时message
的类型为string
类型,此时使用到缩小联合
,使得typescript
可以更加具体的匹配类型。
可选类型填充也就相当于类型 和 undefined
的联合类型。
但是如果向函数中传入null
就会报错。
如上图所示,如果此时我们需要在多种地方使用某一类型的时候,此时我们可以使用类型别名
。
我们先看一个例子。例子1
如上图所示,我们存在通过document.querySelector
来获取一个HTMLElement
对象,但是我们获取的是一个图片元素,但是typescript
并不知道该元素的具体是什么类型的元素。所以当我们使用img.src
来给其赋值时,此时如图一
所示,就会发生报错。当我们使用断言,将img
元素设置为其具体的类型的元素(HTMLElement)
。此时我们就可以正常使用img.src
了。例子2
如上图所示,我们在fun1
函数中需要传入的类型是Person
对象类型,此时我们使用该类型的一个方法study
,但是Person
上并不存在study
方法,但是其子类Student
上存在,我们可以使用断言as
,将p指定为Student子类
。typescript只允许断言为更为具体的类型,或者是不太具体的类型
如上图所示,此时就将message
断言为不太具体的类型any
类型,因为我们知道any
类型的变量可以赋值为任何类型。
如上图所示,此时我们强行将message
转化为其他类型的数据,就会报错。
如上述代码所示,message可能为undefined或者为一个字符串
,此时我们如果打印出message.toUpperCase()
的值,则该值可能为错误的。但是我们可以使用!
来表示非空断言,此时表示当前message
不能为空,跳过ts
在编译阶段对其检错。
?.
如上图所示,我们定义一个Person
类型的数据,age
和friend
属性都是可选的,此时我们将info
的类型设置为Person
,当我们打印出info.friend.name
时就会报错。解决方法
:使用可选链?.
,可选链并不是ts
提出来的,是es11(es2020)
提出后,在ts
中仍然可以使用。表示的意思是:如果friend
的属性值为undefined
时,就会自动返回undefined
,避免从undefined
上读取属性。
!!
表示的意思将其转化为Boolean
类型的值。
??
和三元运算符有相同的用处,表示当前的值为null或者undefined
时,则返回??
后面的值。
如上图所示,字面量类型的类型和值必须一致,并且不能更改。但是字面量类型有什么用途呢?
如上图所示,此时我们给func1
设置参数dir
的类型为Directive
,此时我们dir
只能从left``right``center
中取值。
如图所示,我们设置info对象为 { name:"张三", age: 20 }
,ts
对其类型推断为info:{name:string, age: number}
。
下面一个例子
我们给request中的method中的类型为"POST","GET"类型,但是当我们使用option对象时,此时method类型为string乐行,所以此时request(option)报错
。解决方法一:
使用as const
如上图所示,此时我们设置as const
后,url的类型变为https...
但是仍然是string
类型,我们可以理解为是string
类型的一个子集。method
类型就变为POST
类型。解决方法二:
我们可以给options.method
使用断言,将其断言为POST
类型。解决方法三
使用type
来规定options
的类型。
在给定的执行路径中,我们可以缩小比声明时更小的类型,这个过程称之为 缩小
。typeof padding === "number 可以称之为 类型保护
.
常见的类型保护存在以下几种:typeof
,平等缩小,===,!==
,instancof
,in
等等。一、typeof
二、swich..case.
3、instanceof
4、in
这里的两个是对象的字面量,可以使用in
来查看某一个属性是否在该对象上。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_47450807/article/details/123131421
内容来源于网络,如有侵权,请联系作者删除!