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

TypeScript 中,! 是 非空断言操作符

在 TypeScript 中,! 是 非空断言操作符(Non-null Assertion Operator),它告诉 TypeScript:"这个值绝对不会是 null 或 undefined,请相信我"。

1. 基本用法

let value: string | undefined = getValue(); // 假设 getValue() 可能返回 undefined
console.log(value.length); // ❌ TS 报错:'value' 可能是 undefined
console.log(value!.length); // ✅ 用 ! 断言 value 不是 undefined

注意! 只是告诉 TS 忽略检查,如果实际运行时 value 是 undefined,代码会崩溃!

2. 在 Vue + TS 中的使用

(1) 访问可能为 null/undefined 的 ref 值
const tabId = ref<number | null>(null);
console.log(tabId.value!.toFixed(2)); // ❌ 运行时可能报错,因为 tabId.value 可能是 null

慎用,除非你确定 tabId.value 一定有值(比如在 onMounted 之后)。

(2) 访问模板 ref 的元素
<template><input ref="inputRef" />
</template><script setup lang="ts">
import { ref, onMounted } from 'vue';const inputRef = ref<HTMLInputElement | null>(null);onMounted(() => {// 我们知道 mounted 后 inputRef 一定有值,所以可以用 !console.log(inputRef.value!.focus());
});
</script>
(3) 结合可选链 ?. 使用
const data = { user: { name: "Alice" } };
console.log(data.user?.name); // "Alice"(安全访问)
console.log(data.user!.name); // "Alice"(强制断言 user 存在)

3. 替代方案(比 ! 更安全)

(1) 使用 ?? 或 || 提供默认值
const tabId = ref<number | undefined>(undefined);
console.log(tabId.value ?? 0); // 如果 undefined/null,返回 0
console.log(tabId.value || 10); // 如果 falsy(如 0、""、undefined),返回 10
(2) 使用 if 检查
if (tabId.value !== undefined) {console.log(tabId.value.toFixed(2)); // TS 知道这里 tabId.value 是 number
}
(3) 使用 as 类型断言(谨慎使用)
console.log((tabId.value as number).toFixed(2)); // 强制断言是 number

4. 什么时候用 !?什么时候不用?

情况推荐方式备注
确定变量一定有值value!比如 onMounted 后访问 ref
可能为 null/undefinedvalue?.xxx 或 value ?? defaultValue更安全
第三方库返回的值结合 if 检查或 !(确保文档说明非空)避免盲目信任
http://www.xdnf.cn/news/1296217.html

相关文章:

  • 上网行为安全概述和组网方案
  • EN 61010电子电气设备安全要求标准
  • 抗辐照CANFD通信芯片在高安全领域国产化替代的研究
  • 从根源到生态:Apache Doris 与 StarRocks 的深度对比 —— 论开源基因与长期价值的优越性
  • Gemma 3 多模态推理 通过vllm运行Gemma-3-27B-IT模型的推理服务
  • NineData云原生智能数据管理平台新功能发布|2025年7月版
  • 基于U-NET遥感影像语义分割任务快速上手
  • git upstream
  • 流式数据服务端怎么传给前端,前端怎么接收?
  • 入门概述(面试常问)
  • vercel部署上线
  • 【数据分享】351个地级市农业相关数据(2013-2022)-有缺失值
  • 数智先锋 | 告别运维黑盒!豪鹏科技×Bonree ONE构建全栈智能可观测体系
  • 带环链表详解:环形链表检测与入环节点查找
  • 从 Notion 的水土不服到 Codes 的本土突围:研发管理工具的适性之道​
  • Linux下的软件编程——framebuffer(文件操作的应用)
  • 表达式树实战:Unity动态逻辑编程
  • tp5集成elasticsearch笔记
  • Unity中的神经网络遗传算法实战
  • 一篇文章读懂.Net的依赖注入
  • .NET 的 WebApi 项目必要可配置项都有哪些?
  • .Net4.0 WPF中实现下拉框搜索效果
  • 面试题之项目中git如何进行管理
  • 如何启动本机mysql数据库
  • 在mysql> 下怎么运行 .sql脚本
  • XCTF-warmup详细题解(含思考过程)
  • Morph Studio-一站式AI视频创作平台
  • Vue浅学
  • Elasticsearch 中如何配置 RBAC 权限-实现安全的访问控制
  • QT6(创建第一个QT项目)