TS:如何判断联合类型变量的具体类型?

一 表示一个值可以是几种类型之一:联合类型

在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)

大家懂了吗!

猜你喜欢

转载自blog.csdn.net/weixin_45809580/article/details/130740073