1,类型断言
类型断言更像是类型的选择,而不是类型转换
举例:
// 函数的参数 val 是一个联合类型,在这里的意思是说 val 可以是字符串类型也可以是数值类型。
function func(val: string | number): number {
if (val.length) {
return val.length
} else {
return val.toString().length
}
}
代码中要返回参数的长度,但是 length 可以是字符串的属性,而数值是没有这个属性的,所以当 val 是数值时,就先用 toSting() 来将数字转换为字符串再取长度。
这样的逻辑本身没问题,但是在编译阶段一访问 val.length 时就报错了,因为 访问联合类型值的属性时,这个属性必须是所有可能类型的共有属性,而length不是共有属性,val 的类型此时也没确定,所以编译不通过。为了通过编译,此时就可以使用类型断言了,如下:
function func(val: string | number): number {
if ((val as string).length) {
return (val as string).length
} else {
return val.toString().length
}
}
把 val 断言为了 string类型,此时就可以访问 length 属性了。你可能会疑惑如果 val 断言为了string,那么开始定义的联合类型是不是失去了它的意义?答案是否定的。可以理解为在编译阶段强行把 val 当作 string类型来访问了。