TS学习笔记(四)
1. 类型缩小(联合类型)
对变量进行类型缩小,除了使用as断言外,还可以使用if else(switch也行)。如下
function printId( id:number|string ) { if (typeof id === 'string') { console.log(id.toUpperCase()); } else { console.log(id); } }
类型缩小是TS处理联合类型的标准方法(说明处理联合类型时,经常需要类型缩小),凡是遇到可能为多种类型的场合,都需要先缩小类型,再进行处理。
2.交叉类型
指的是多个类型组成一个新类型,&。其实就是逻辑并且的意思,都要包含才行。
let x:number&string;
上面事例中,变量x同时是数值和字符串,这当然是不可能的,所以ts会认为x的类型实际上是never。
const s:[string, string, boolean] = ['a', 'b', true];
元组类型的写法与数组有一个重大差异。数组的成员类型写在方括号外卖(number[]),元组的类型写在方括号里面([number])
由于需要声明每个成员的类型,所以大多数情况下,元组的成员数量是有限的,从类型声明就可以明确知道,元组包含多少个成员,越界的成员会报错。
let myFunc:(a:number,b:number) => number; myFunc = (a:number) => a; // 正确 myFunc = (a:number,b:number,c:number)=> a+b+c // 报错
这是因为js函数在声明时往往有多余的参数,实际使用可以只传入一部分参数。比如,forEach的参数是一个函数,默认有三个参数(item,index,array)=>void,实际往往只使用第一个参数。因此,ts允许传入的参数不足。
函数的类型声明还有一种对象的写法。这种写法非常适合一种场景:函数本身存在对象,如下。
let foo:{ (x:number):void; version:string } function f(x:number) { console.log(x); } f.version = '1.0';
8.Function类型
任何函数都属于这个类型,Function类型的函数可以接收任意数量的参数,每个参数的类型都是any,返回值的类型也是any,代表没有任何约束。牛逼!以后不知道函数的类型怎么声明,就用它。
function f(x?:number){ return x }
f() // 正确 f(undefined) // 正确
上面示例中,参数x是可选的,等同于说x可以赋值为undefined。
但是反过来就不成立,类型显示设为undefined的参数,就不能省略。
function f(x:number|undefined) { return x; } f() // 报错
函数的可选参数只能在参数列表的尾部,跟在必选参数的后面,放在必选参数前面会报错。
如果一个变量要套用另一个函数类型,有一个小技巧,就是使用typeof 运算符
function add( x:number, y:number ) { return x + y; } const myAdd:typeof add = function (x, y) { return x + y; }
10. 函数参数默认值
设有默认值的参数,如果传入undefined,也会触发默认值
function f(x = 456) { return x; } f(undefined) // 456
11. void类型
void类型可以返回undefined或null,返回其他值会报错。
js规定,如果函数没有返回值,就等同于返回undefined。