关于TypeScript,我也没学过,写这篇文章就是写我自己的理解,有不对的地方希望大家多指点一下。
这个错误只有在编译的时候才会发现,ts就会解决这个问题,ts每个文件都是一个模块,不加会认为是全局。
已经增加类型了只不过是任意类型,这个叫联合类型对象属性,并且获取到的length是Number类型,需要小写,
在查看版本,建立的文件要.ts结尾
生成JS代码,然后引入html中,想要不这么运行可以安装这个库需要依赖这个包,运行就是 ts-node helloWorld.ts
语法:
给标识符添加类型注解,
数组类型:
在开发中,数组的数据类型要保持一致,
数组存放字符串类型,另一种写法Array<string>
对象:
这个是空对象类型,开发不会这么写
这个图是let info={}这个报错得原因是没有和类型保持一致
函数类型和对象类型得结合使用:
,
可选类型
null,undefined类型:
函数参数的类型:
在定义函数时,都要明确指定参数类型,返回值会自动推导,也可以明确指定,
如果写any就无法校验类型,我们可以定义对象类型
建议把返回值也写上
匿名函数得参数类型
any类型:
unknown类型:
和any类型相似,但是unknown类型得值上做任何事情都是不合法得,any是都合法
非法,不知道是什么类型,用unkonow必须要用类型校验
void类型,一个函数没有返回值:
,void可以返回undefined
应用场景,这样只能穿函数,传别的会报错,没有明确返回值才加void,类型推导出来得void可以有返回值并且不会报错
never类型:实际开发用不到,会自动推导出来
这个数组什么都不会放结果就是never类型,
这个default后面是永远不会执行的,所以check是never类型,不写也可以运行,为什么要写上
假如别人调用这个函数,传入的是布尔值,
他在类型校验处加上了boolean类型,但是这个封装的函数没有对布尔类型做处理,如果加上这段代码,当传入的是布尔值,走的是默认模块,但是check的类型是never类型,不是布尔类型,这时,这个位置就会报错,间接的提示case应该加一个布尔类型
元组类型tuple:
,这种方法是可以存储数据,但是拿到某一个数组中的数据,value是没有类型的,因为info1是一个数组,并且数组里面的数据是any类型,
第二种方法就是对象
这样就会显示类型,
元组类型
这种表示就是元组类型,相对于数组优点,元组可以存放不同的数据结构,取出来的item也是有类型的
在函数中使用元组是最多的
这么写就是可以看到数组里面的类型,这个是react
语法细节
联合类型和交叉类型:
联合类型:或者的意思,但是这么做的时候用方法需要类型缩小
类型别名:
这么写会造成阅读较差
这时候可以做抽取,给这种类型起一个别名
别名可以复用
接口声明:
这两个用法一样,都可以声明对象类型
type和interfacv区别
区别一:
type类型可以声明基本类型,使用范围更广
而接口类型只能声明对象,
区别二:
type不许相同别名同时存在,接口声明可以,
这样写会报错,要这么写,
区别三:
接口声明可以继承类型
必须同时满足
交叉类型:
交叉类型场景
类型断言:
,返回的是确切的类型
使用类选择器的话,会报错,因为不知到是绑定在img上还是div上,img1拿到的是element类型,因为element类型上没有src和alt,所以会报错,
这个时候就可以用类型断言as
,这样就相当于强制转换类型,此时imgE1就是as后面的那个类型了,然后就可以不用写判断了,
已经确定类型,就可以用类型断言,
类型断言的规则:
,不可以这么断言,断言只能断言成更加具体的类型或者不太具体的类型,但是尽量不要断言成不太具体的类型
非空类型断言:
访问的角度可以用可选链,但是给属性赋值不可以
赋值表达式左边不可以用可选链,这个是语法问题,从编译的角度就报错了,解决方法一,类型缩小,解决方法二:非空断言:意思就是,强制告诉Ts 不用检查他是否为空,一定要确保有值的情况,这种会跳过ts编译,慎重用。
字面量类型:
,
,只能选择字面量
举例子:封装请求方式,第二个参数,想传get或者post,
ts细节:这么做会报错的原因就是这个对象的类型里面,method现实的是字符串类型,怎么解决这个问题?
可以用类型断言:,还可以让info变成字面量类型
字面量推理
,嫌弃这种麻烦还可以,readonly是只读类型,强制变成字面量类型
类型缩小:
平等缩小:(类型缩小的一种)
instanceof,是否是这个类的实例(类型缩小的一种)
in操作符,anmial里面是否有key为swim的属性(类型缩小的一种)
TS中函数的类型
函数的参数有类型,函数的返回值有类型,但这两个都是函数的一部分,函数本身也是一个标识符,也应该有自己的类型,
这两个函数是一样的,
如果是any类型的话,那么就不知道bar是什么类型的
在js中函数可以作为一等公民(函数作为参数,也可以作为返回值进行传递),我们可以编写函数类型表达式来表示函数类型
转变成这样
如果写成TS得话
这里注意匿名函数不需要写类型注解
看清楚是传入的函数,这是高阶函数,对里面的函数参数不进行类型检测
调用签名:
这是函数表达式写法,函数是函数,但是,函数的本身也是个对象,从对象的角度看,函数也可以有其他的属性,
表达式只能表达他是一个函数,并不能表达他是一个对象,这时候可以写(使用)成函数的调用签名
开发中如何选择,单独函数就用函数表达式,有属性就用函数调用签名
构造签名:
函数中的可选参数
函数中的默认参数
函数的剩余参数接收
函数重载:
从这张图片中可以看出arg1和arg2都是any类型,这么做怎么调都不会报错,第一种方法可以
函数内部执行逻辑相同,第二种