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

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

1. 基本用法

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

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

2. 在 Vue + TS 中的使用

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

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

(2) 访问模板 ref 的元素
javascript 复制代码
<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) 结合可选链 ?. 使用
javascript 复制代码
const data = { user: { name: "Alice" } };
console.log(data.user?.name); // "Alice"(安全访问)
console.log(data.user!.name); // "Alice"(强制断言 user 存在)

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

(1) 使用 ??|| 提供默认值
javascript 复制代码
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 检查
javascript 复制代码
if (tabId.value !== undefined) {
  console.log(tabId.value.toFixed(2)); // TS 知道这里 tabId.value 是 number
}
(3) 使用 as 类型断言(谨慎使用)
javascript 复制代码
console.log((tabId.value as number).toFixed(2)); // 强制断言是 number

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

情况 推荐方式 备注
确定变量一定有值 value! 比如 onMounted 后访问 ref
可能为 null/undefined value?.xxxvalue ?? defaultValue 更安全
第三方库返回的值 结合 if 检查或 !(确保文档说明非空) 避免盲目信任
相关推荐
羽沢3114 分钟前
ECharts 学习
前端·学习·echarts
LYFlied17 分钟前
WebAssembly (Wasm) 跨端方案深度解析
前端·职场和发展·wasm·跨端
七月丶18 分钟前
实战复盘:我为什么把 TypeScript 写的 CLI 工具用 Rust 重写了一遍?
前端·后端·rust
over69721 分钟前
《闭包、RAG与AI面试官:一个前端程序员的奇幻LangChain之旅》
前端·面试·langchain
JIngJaneIL25 分钟前
基于java+ vue交友系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·交友
苹果酱056733 分钟前
解决linux mysql命令 bash: mysql: command not found 的方法
java·vue.js·spring boot·mysql·课程设计
拉不动的猪36 分钟前
回顾计算属性的缓存与监听的触发返回结果
前端·javascript·vue.js
karshey1 小时前
【IOS webview】h5页面播放视频时,IOS系统显示设置的icon
前端·ios
树欲静而风不止慢一点吧1 小时前
小米手环9应用/游戏开发快速入门
前端·javascript·小程序