非空断言操作符和可选链运算符

在TypeScript中,非空断言操作符 ! 和可选链运算符 ?. 服务于不同的目的,尽管它们都与处理可能为 null 或 undefined 的值有关。

  1. 非空断言操作符 (!):

    • 使用场景:当你确定某个变量在当前上下文中肯定不是 null 或 undefined 时,可以使用非空断言操作符。
    • 语法:variableName!
    • 功能:告诉编译器“我保证这个表达式在运行时不会是 null 或 undefined”,从而绕过静态类型检查以避免错误提示。
    • 示例:
       
      let maybeUser: User | null = getUser();
      if (maybeUser !== null) {
          // 这里 TypeScript 会推断 maybeUser 不可能是 null,但为了消除警告,我们可以使用非空断言
          console.log(maybeUser!.name); 
      }
    • 注意:如果在运行时该值确实为 null 或 undefined,将会抛出错误。
  2. 可选链运算符 (?.):

    • 使用场景:安全地访问深度嵌套的对象属性或调用可能不存在的方法,当路径中的任何中间对象为 null 或 undefined 时,整个表达式将返回 undefined,而不是抛出错误。
    • 语法:object?.property 或 object?.method()
    • 功能:如果 object 是 null 或 undefined,则不再尝试访问其后面的属性或方法,而是立即返回 undefined
    • 示例:
       
      let maybeUser: User | null = getUser();
      console.log(maybeUser?.name); // 如果 maybeUser 为 null,则不会尝试访问 name 属性,结果为 undefined
      
      function getUserName(user?: User) {
        return user?.name; // 如果 user 未定义或为 null,则直接返回 undefined
      }
    • 注意:可选链运算符允许你编写更简洁、安全的代码,因为它会在链式访问过程中自动短路。

总结起来,非空断言 ! 是用来强制告诉编译器一个值一定存在,而可选链运算符 ?. 则是一种防御性编程工具,用于条件地访问可能不存在的属性或方法。

你可能感兴趣的:(#,ts,前端)