这是我参与2022首次更文挑战的第36天,活动详情查看:2022首次更文挑战
逻辑中的类型守卫
逻辑表达式在求值时会判断操作数的真与假。如果一个值转换为布尔值后为true,那么这个值就为真值。相反如果一个值转换为布尔值为false,那么这个值就是假值。其中为false的值为undefined、null、boolean中的false、number中+0和-0以及NaN、string中的空字符串、bigint中的0n,其他的为true。这些值的判断也可以用于if判断语句中。
function z(y: null | true | false | undefined) {
if (y) {x;}
else {x;}
}
逻辑非运算符!是一元运算符。如果逻辑非运算符的操作数为真,那么逻辑非表达式的值为false。如果逻辑非运算符的操作数为假,那么逻辑非表达式的值为true。逻辑与运算符&&是二元运算符。如果左边操作数假,就返回左边操作数。如果左边操作数为真就返回右边操作数。逻辑或运算符||也是二远运算符。如果左侧操作数为真,那么返回左侧操作数,如果左侧操作数为假,那么返回右操作数。如果注意的是如果在对象属性上使用逻辑与或非类型守卫,然后对该对象进行赋值操作,那么类型守卫就会失效,不会进行类型细化。
function z(y: undefined | number | null) {
if(y !== undefined && y !== null) {x;}
else {x;}
}
除此之外还有等式表达式,分别为===、!==、==、!==这四种,它们能够将两个值进行比较并返回一个布尔值。如果等式运算符的操作数其中一个为undefined或null值,那么这个等式类型守卫也是一个空值类型守卫,空值类型守卫能够将一个值的类型细化为空类型或非空类型。如果等式类型守卫中使用严格相等运算符===或!==,那么细化时会将undefined类型与null类型进行区分,如果一个值严格等于undefined值,那么这个值细化后为undefined类型,而不是联合类型。如果等式类型守卫中使用非严格相等运算符==或!==,那么类型细化时会将undefined类型和null类型划分为相同的空类型。不管我们在等式类型守卫中使用的是undefined值还是null值,结果都是一样的。如果使用非严格相等运算符判定一个值等于undefined值,那么这个值就会细化为联合类型。
function z(x:boolean | undefined | null) {
if(x == undefined) {x;}
else {x;}
}