TypeScript
1 类型基础
1.1 原始数据类型
boolean、string、number、void、null、undefined、Symbol、BigInt
注意:
1、null与undefined是所有类型的子集。
2、由构造函数创建的对象本质是一个对象。如下代码便会报错。
let createdByNewBoolean:boolean=newBoolean(1);// Type 'Boolean' is not assignable to type 'boolean'.// 'boolean' is a primitive, but 'Boolean' is a wrapper object. Prefer using 'boolean' when possible.
3、void用于定义无返回值的函数,若用于定义变量,则只能赋值undefined/null,并无太大意义。
2.2 定义对象类型
ts中使用接口(interface)来定义对象,一方面约束了对象属性的类型,一方面约束了对象的形状(必须完全遵循接口属性的数量)。
interfacePerson{
name:string;
age:number;}let tom: Person ={
name:'Tom',
age:25};
1、可选属性:属性名后加问号即可。
2、任意属性:定义了任意属性后,确定属性与可选属性必须是它的子集。
3、只读属性:readonly放于属性名前即可。约束了属性无法被重新赋值,但需注意的是,只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候。
注意:接口一般首字母大写,官方推荐接口名以I开头更清晰
2.3 定义数组类型
1、类型+方括号定义。
2、数组泛型:Array<类型>
3、接口表示数组:数组的本质是对象,定义index为number即可。
interfaceNumberArray{[index:number]:number;}let fn: NumberArray =[1,1,2,3,5];
该定义方法多存在于类数组中,如函数的arguments,就是类数组,可以使用数组的length、使用下标获取到项,但是却无法使用任何数组的方法,如arr.sort(),且其本身有一个属性callee,指向当前的函数。此时就需要使用接口来定义。
interfaceIArgs{[index:number]:number;
length:number;
callee:Function;}functionsum(){let args: IArgs = arguments;}
2.4 定义函数类型
1、需要对函数的参数及返回值进行类型约束。
letmySum:(x:number, y:number)=>number=function(x:number, y:number):number{return x + y;};
往往左边的类型声明可以省略,因为它会通过类型推断自动得出类型。
2、可以用接口来定义函数
interfaceSearchFunc{(source:string, subString:string):boolean;}let mySearch: SearchFunc;mySearch=function(source:string, subString:string){return source.search(subString)!==-1;}
3、注意:
(1)可以写可选参数,也是后面加问号即可。但是必须按必须参数>可选参数的顺序来写。若参数设置了默认值,则将其认定为可选参数,且不受必须参数>可选参数的限制。
(2)剩余参数为一个数组,采用数组的方式定义即可
(3)函数的重载对于参数的类型限制可以采用联合类型声明的方式
functionreverse(x:number):number;functionreverse(x:string):string;functionreverse(x:number|string):number|string|void{if(typeof x ==='number'){returnNumber(x.toString().split('').reverse().join(''));}elseif(typeof x ==='string'){return x.split('').reverse().join('');}}
前两句代码的意义是为了明确当输入为number的时候、输出也必须为number等。TypeScript 会优先从最前面的函数定义开始匹配,所以多个函数定义如果有包含关系,需要优先把精确的定义写在前面。
2 基础概念
2.1 类型推论
变量在定义时只赋了初值但没有指定类型,ts会自动推断类型并在后续的操作中校验。当然,若定义时并没有赋值,则会默认为any而不被校验。
2.2 联合类型
取值可以为多种中的一种,不同的类型用|分隔。
若变量未被赋值而不确定是哪一种类型时,只能访问所有类型共有的属性或方法。
2.3 类型断言
值 as 类型
可以跳过编译器的校验,即编辑者明确此处为何类型,通知ts以这种类型看待它而不去校验值。用途:明确此处断言类型后不会发生语法错误。
- 联合类型可以被断言为其中一个类型
- 父类可以被断言为子类
- 任何类型都可以被断言为 any
- any 可以被断言为任何类型
- 要使得 A 能够被断言为 B,只需要 A 兼容 B 或 B 兼容 A 即可
版权归原作者 浪漫不敌风月 所有, 如有侵权,请联系我们删除。