当前位置: 首页 > article >正文

ts 非空断言

非空断言(Non-null Assertion)是 TypeScript 提供的一种语法,用于在开发者明确知道某个值不会为 nullundefined 时,强制 TypeScript 停止对该值的 nullundefined 检查。

1. 非空断言的语法

非空断言使用 ! 符号,它放在变量后面。这个符号告诉 TypeScript:

  • “我确信这个值不会是 nullundefined,请不要再进行类型检查。”
const value: string | null = "hello"; const length = value!.length; // 确保 value 不是 null 或 undefined

在这个例子中,value! 表示开发者确信 value 不是 nullundefined,即使类型声明中 value 可能为 null。使用 ! 后,TypeScript 会认为 value 始终是 string 类型。

2. 非空断言的使用场景

非空断言通常用于以下场景:

  • 当你从某个操作中获取一个值,并且你确信它一定不会是 nullundefined 时。

    • 例如,某个函数或 API 返回的值,如果你已经根据上下文或逻辑推断该值是存在的,那么就可以使用非空断言来避免 TypeScript 提示错误。
    function getElementById(id: string): HTMLElement | null {
      return document.getElementById(id);  // 返回值可能是 HTMLElement 或 null
    }
    
    const element = getElementById("myElement");
    element!.innerText = "Hello, world!";  // 确保 element 不是 null
    

  • 在你确定某个值在运行时会被赋值的情况下。

    • 如果你知道某个变量在某个时刻一定会被赋值(例如,它在构造函数中被初始化),你可以使用非空断言来避免 TypeScript 的 nullundefined 检查。
      class MyClass {
        private value!: string;  // 使用非空断言,表明 value 总会被初始化
      
        constructor() {
          this.value = "Hello";
        }
        
        printValue() {
          console.log(this.value);  // 不会报错,因为 value 已经被初始化
        }
      }
      

3. 非空断言的潜在问题

尽管非空断言可以减少类型检查,但它也会绕过 TypeScript 的类型安全机制。如果你错误地断言了一个值不会为 nullundefined,但实际上它可能为 nullundefined,会导致运行时错误。例如:

const value: string | null = null; console.log(value!.length); 
// 运行时错误:Cannot read property 'length' of null

这里,尽管你用 ! 强制 TypeScript 忽略了 null 检查,但实际运行时 valuenull,所以会导致错误。

4. 非空断言与类型保护的比较

非空断言是一个“强制”语法,它告诉 TypeScript 忽略 nullundefined 检查。而类型保护是另一种手段,它是通过代码逻辑来确保变量在某个点上不会为 nullundefined。例如使用 if 检查:

const value: string | null = "hello"; 
if (value !== null) { console.log(value.length); 
// 类型检查通过,value 已经被确保不是 null }

类型保护是更安全的方式,因为它基于代码逻辑而不是强制断言。

5. 总结

  • 非空断言通过 ! 强制 TypeScript 停止 nullundefined 检查。
  • 它适用于开发者确定某个值不会是 nullundefined 时,但使用时需要小心,避免潜在的运行时错误。
  • 当可以通过类型保护(例如 if (value !== null))确保值不是 null 时,推荐使用类型保护。

非空断言的作用是让你在特定情况下更有控制权,但过度使用或错误使用可能会导致问题,因此需要在确信无误的情况下使用它。


http://www.kler.cn/a/413241.html

相关文章:

  • DDR3与MIG IP核详解(一)
  • R虚拟环境中安装ncdf4库包编译库问题
  • v-for产生 You may have an infinite update loop in a component render function
  • 排序算法之选择排序篇
  • Rust语言俄罗斯方块(漂亮的界面案例+详细的代码解说+完美运行)
  • 【Git】常用命令汇总
  • 跨平台应用开发框架(2)----Qt(窗口篇)
  • Linux 下自动化之路:达梦数据库定期备份并推送至 GitLab 全攻略
  • 开箱即用!合合信息的智能文档处理“百宝箱”
  • 华三堆叠配置实验
  • Java对象集合使用Java 8的Stream API合并数据
  • 华为云国内版与国际版的差异
  • ML 系列:第 31 节— 机器学习中的协方差和相关性
  • 01-go入门
  • 游戏引擎学习第21天
  • 设计模式:12、中介者模式
  • 跨域问题?同源策略大全
  • 代码随想录算法训练营第十一天(LeetCode150.逆波兰表达式求值;LeetCode239.滑动窗口最大值;LeetCode347.前K个高频元素)
  • 欢迪迈手机商城:基于SpringBoot的多平台支持
  • Qt之详解QLockFile 文件锁
  • React的ts文件中通过createElement拼接一段内容出来
  • 以太事件解析 #7 事件侦听_02
  • 第四十篇 DDP模型并行
  • Android基本概念及控件
  • 23种设计模式-享元(Flyweight)设计模式
  • 基于SSM的婴幼儿用品商城系统+LW示例参考