非空断言!和?

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在观看一些代码的时候碰到的一些疑惑🤔️

一、非空断言

对于那些可能为空的变量(即可能等于undefined或null),TypeScript 提供了非空断言,保证这些变量不会为空,写法是在变量名后面加上感叹号!。

二、例

1.!用法

当你在值后使用 ! 时,你告诉 TypeScript,你知道这个值不是 null 或 undefined,尽管编译器无法证明。

let x: string | null = null;
console.log(x!); // 错误:不能访问 null 的属性(属性 'length' 在类型 'null' 上不存在)

let y: string = 'hello';
console.log(y!); // okay,TypeScript 知道 y 不是 null 或 undefined

let z: string | null = 'hello';
console.log(z!); // okay,TypeScript 知道 z 不是 null 或 undefined

在第一个示例中,x 声明为字符串或 null,并且初始化为 null。 cuando 我们尝试访问 x 的 length 属性,TypeScript 抛出错误,因为它知道 x 可能是 null。

在第二个示例中,y 声明为字符串,并且初始化为字符串值。 cuando 我们使用 ! 后缀 y,TypeScript 知道 y 不是 null 或 undefined,所以可以访问其属性。

在第三个示例中,z 声明为字符串或 null,但它初始化为字符串值。 quando 我们使用 ! 后缀 z,TypeScript 知道 z 不是 null 或 undefined,所以可以访问其属性。

! 符号在你工作于数据时非常有用,这些数据你知道不是 null 或 undefined,但编译器无法证明。然而,请小心使用 ! 符号,因为如果你错误地认为值是 null 或 undefined,你将得到运行时错误。

2.?用法

当你使用 ?. 后缀访问属性或方法时,你告诉 TypeScript,这个属性或方法可能是 null 或 undefined,你想访问它的值或调用它,而不抛出错误如果它是 null 或 undefined。

interface Person {
  name: string;
  address?: {
    street: string;
    city: string;
  };
}

let person: Person = { name: 'John' };
console.log(person?.address?.street); // 输出:undefined

let person2: Person = { name: 'Jane', address: { street: '123 Main St', city: 'Anytown' } };
console.log(person2?.address?.city); // 输出:"Anytown"

在第一个示例中,person 有一个可选的 address 属性(即,它可能是 null 或 undefined)。当我们使用 ?. 访问 address 的 street 属性时,TypeScript 知道 address 可能是 null 或 undefined,所以它不会抛出错误如果它是 null 或 undefined。相反,它 simply 返回 undefined。

在第二个示例中,person2 有一个 address 属性不是 null 或 undefined。当我们使用 ?. 访问 address 的 city 属性时,TypeScript 知道 address 不是 null 或 undefined,所以它返回 city 属性的值。

? 符号在你工作于数据时非常有用,这些数据可能是 null 或 undefined,你想访问它的属性或方法而不抛出错误。它也非常有用,当你工作于可选的属性或方法,它们可能不总是存在。

需要注意的是,? 符号只用于属性访问和方法调用,不用于变量赋值。例如:

let x: string | null = null;
x?.toString(); // 错误:不能将值赋给 'x',因为它是 null

在这个示例中,我们尝试使用 ?. 操作符将值赋给 x,这不是允许的相反,我们应该使用 || 操作符提供默认值如果 x 是 null 或 undefined。

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值