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 检查或 !(确保文档说明非空) 避免盲目信任
相关推荐
阿虎儿28 分钟前
React Context 详解:从入门到性能优化
前端·vue.js·react.js
Sailing1 小时前
🚀 别再乱写 16px 了!CSS 单位体系已经进入“计算时代”,真正的响应式布局
前端·css·面试
喝水的长颈鹿1 小时前
【大白话前端 03】Web 标准与最佳实践
前端
爱泡脚的鸡腿1 小时前
Node.js 拓展
前端·后端
左夕2 小时前
分不清apply,bind,call?看这篇文章就够了
前端·javascript
Zha0Zhun3 小时前
一个使用ViewBinding封装的Dialog
前端
兆子龙3 小时前
从微信小程序 data-id 到 React 列表性能优化:少用闭包,多用 data-*
前端
滕青山3 小时前
文本行过滤/筛选 在线工具核心JS实现
前端·javascript·vue.js
时光不负努力3 小时前
编程常用模式集合
前端·javascript·typescript
时光不负努力3 小时前
ts+vue3开发规范
vue.js·typescript