商道如狼道 发表于 3 天前

2.3 TypeScript 非空断言操作符(后缀 !)详解

在 TypeScript 中,当你开启了严格的空值检查(strictNullChecks)后,变量如果大概是 null 或 undefined,就必须在使用进步行显式的判断。为了在某些场景下简化代码,TypeScript 提供了非空断言操作符(! 后缀符号),用来告诉编译器:“我确定这个值不是 null 或 undefined。”
这在你非常确信某个值在使用时肯定有效、不会为空时特殊有效。
一、语法阐明

const nonNullValue: Type = value!;

[*]nonNullValue:你希望保存非空值的变量。
[*]Type:你盼望该变量的类型。
[*]value:你正在断言不会为 null 或 undefined 的原始值。
[*]!:告诉 TypeScript 编译器,value 肯定不是空值。
二、使用场景示例

示例 1:参数大概为 null 的函数

我们定义了一个吸收 name 参数的函数 greetUser,该参数的类型为 string | null。为了确保后续使用时不会因 null 而报错,我们使用非空断言操作符 !,告诉编译器这个值肯定不为空。
function greetUser(name: string | null) {
// 使用非空断言操作符,确保 name 非空
const formattedName: string = name!;
console.log(`Hello, ${formattedName || 'Felixlu'}!`);
}

greetUser("JackWang"); // 输出: Hello, JackWang!
greetUser(null);   // 输出: Hello, Felixlu! ✅ 注意:虽然使用了 !,但 null 依然传入了,此时 formattedName 是 null,所以回退到 'Felixlu'。这阐明 ! 只影响编译阶段的类型检查,不会改变运行时行为。
示例 2:访问可选属性时使用非空断言

下面我们定义了一个 User 类型,它的 email 属性是可选的(email?: string),也就是说它大概为 undefined。在访问 email 时,TypeScript 会提示大概为空,但如果我们确信它肯定存在,可以使用 ! 进行断言:
type User = {
name: string;
email?: string;
};

const user: User = {
name: "Felixlu",
// 未提供 email
};

// name 是必填属性,无需断言
const userName: string = user.name;

// 使用非空断言访问 email
const userEmail: string = user.email!;

console.log(`User Name: ${userName}`);
console.log(`User Email: ${userEmail}`); 输出:
User Name: Felixlu
User Email: undefined ⚠️ 注意:user.email! 断言只告诉编译器不要报错,但不会制止你访问一个实际为 undefined 的值。因此运行时仍然会输出 undefined,你必要自己保证其存在性。
三、使用非空断言的最佳实践

虽然 ! 操作符非常方便,但也有肯定风险。以下是一些建议:
✅ 推荐使用的场景
❌ 应避免的场景
你 100% 确信某个值已经初始化或赋值完毕
值的存在依赖异步逻辑或外部条件
在模板渲染、DOM 操作中确保某元素已挂载
在尚未完成数据加载前使用非空断言
示例:推荐使用场景

const input = document.querySelector('input#username')!;
// 此处 input 一定存在(你确信页面结构),所以使用 ! 是合理的
input.value = "Felixlu"; 四、总结

TypeScript 的非空断言操作符 ! 是一种在你确信值不会为 null 或 undefined 时,跳过编译期空值检查的强盛工具。它简化了代码逻辑,但也带来了隐藏的运行时风险。
使用时请确保断言背后的前提条件是可靠的,否则大概导致难以发现的 bug。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 2.3 TypeScript 非空断言操作符(后缀 !)详解