一 表示一个值可以是几种类型之一:联合类型
在TS中我们常会遇到这样一个问题。
一个变量,即可能是这种类型,也可能是那种类型,然后根据传入的类型的不同进行不同的操作。
比如下面这种情况:
if (pet.name === 'fish') {
pet.swim();
}
else {
pet.fly();
}
这里的pet可能具有两种类型:
interface Fist = {
name: string;
swim: (): void
}
interface Brid = {
name: string;
fly: (): void
}
表示一个值可以是几种类型之一。 我们用竖线( |)分隔每个类型,所以 number | string | boolean表示一个值可以是 number, string,或 boolean。
在这里,让pet可能具有两种类型,我们如下书写:
pet: Fish | Bird
但是我们发现,这时候我们不能直接使用pet.swim了pet.fly属性了。
使用pet.swim时,编译器提示类型Brid中不包含此属性。
而使用pet.fly时,编译器提示类型Fist中不包含此属性。
当一个变量为联合类型时,它无法直接访问联合类型中的非公共属性。因为它的类型不确定。
如果ts可以在运行时确定pet的具体属于哪个类型,就可以解决这个问题了。
这就出现下一个问题:如何在ts中,判断联合类型变量的具体类型?
二 如何判断联合类型变量的具体类型:类型保护
2.1 自定义类型保护
可以自己写一个自定义函数,用来判断变量的类型,这个函数返回一个布尔值。
返回值类型中使用 参数 is 类型 做定义。
当返回值为true时,任务参数 is 类型成立,否则不成立。
function isFish(pet: Fish | Bird): pet is Fish {
return (<Fish>pet).swim !== undefined;
}
上面代码中记录了一个自定义函数isFish,返回值类型为 pet is Fish ,也就是说当返回值为true时,ts认为pet是Fish类型,否则是Bird类型。
自定义函数的使用方式如下:
if (isFish(pet)) {
pet.swim();
}
else {
pet.fly();
}
2.2 type
基础类型还可以使用type来进行类型判断。
当type判断变量为"number", “string”, "boolean"或 "symbol"类型时,接下来的代码中该变量将被视为相关类型。
注意如果type判断变量为除四种外的其他类型,ts将无法识别,也就是该变量仍然被视为原有类型不变。
const a: number | string = 'abc'
const b = a.length // 报错
if(type a === string) {
const b = a.length // ok
}
2.3 instanceof类型保护
用法和js相同,用来判断构造函数。
2.4 剔除null与undefined
变量在未赋值时可能为null或undefined,这很常见。
但是在使用时就会报错,undefined上不包含该属性。
也就是变量类型为包含null/undefined的联合类型。
当一个变量的联合类型中含有null,可以直接通过判断去掉。
function f(sn: string | null): string {
if (sn == null) {
return "default";
}
else {
return sn;
}
}
为一个变量剔除null和undefined选项,也可以通过!进行快捷断言。
name!.charAt(0)
大家懂了吗!
、