typescript 中的可选链、非空断言操作符和空值合并操作符

在 TypeScript 中,有几个操作符在处理可能为 nullundefined 的值时非常有用,它们分别是可选链操作符(Optional Chaining Operator)、非空断言操作符(Non-null Assertion Operator)和空值合并操作符(Nullish Coalescing Operator)。下面是这些操作符的详细解释和示例:

1. 可选链操作符(Optional Chaining Operator)

可选链操作符 ?. 允许你安全地访问嵌套对象的属性,即使某些属性可能是 nullundefined。如果链中的某个部分是 nullundefined,表达式的结果立即返回 undefined,而不是抛出错误。

示例

typescript 复制代码
interface User {
  name?: string;
  address?: {
    city?: string;
  };
}

const user: User = {
  name: "John",
  address: null
};

const city = user.address?.city; // 结果为 undefined,而不是抛出错误

2. 非空断言操作符(Non-null Assertion Operator)

非空断言操作符 ! 用于告诉 TypeScript 编译器某个值一定不是 nullundefined。这在你确信某个值不为空但 TypeScript 无法推断出来的情况下非常有用。

注意: 滥用非空断言操作符可能会导致运行时错误,因此应谨慎使用。

示例

typescript 复制代码
function getName(user: { name?: string }) {
  return user.name!; // 使用非空断言操作符,告诉 TypeScript user.name 一定不为 null/undefined
}

// 使用示例
const user = { name: "Alice" };
console.log(getName(user)); // 输出 "Alice"

3. 空值合并操作符(Nullish Coalescing Operator)

空值合并操作符 ?? 用于为可能为 nullundefined 的表达式提供一个默认值。与逻辑或操作符 || 不同,?? 只在左侧表达式为 nullundefined 时才返回右侧表达式。

示例

typescript 复制代码
const message = null ?? "Default message"; // 结果为 "Default message"
const value = 0 ?? "Default value";        // 结果为 0,因为 0 不是 null 或 undefined

// 另一个示例
const userInput = "";
const displayedMessage = userInput ?? "No input provided"; // 结果为 "",因为 "" 是空字符串,但不是 null 或 undefined
const fallbackMessage = userInput || "No input provided";  // 结果为 "No input provided",因为 || 会在左侧表达式为 falsy 值时返回右侧表达式

总结

  • 可选链操作符 (?.):安全地访问嵌套对象属性,防止 nullundefined 导致的错误。
  • 非空断言操作符 (!):告诉 TypeScript 某个值一定不为 nullundefined,但应谨慎使用。
  • 空值合并操作符 (??):在左侧表达式为 nullundefined 时提供一个默认值,与逻辑或操作符 || 不同,它只关注 nullundefined

这些操作符可以大大提高代码的健壮性和可读性,尤其是在处理可能为 nullundefined 的值时。

相关推荐
Myli_ing1 分钟前
考研倒计时-配色+1
前端·javascript·考研
余道各努力,千里自同风4 分钟前
前端 vue 如何区分开发环境
前端·javascript·vue.js
PandaCave11 分钟前
vue工程运行、构建、引用环境参数学习记录
javascript·vue.js·学习
软件小伟13 分钟前
Vue3+element-plus 实现中英文切换(Vue-i18n组件的使用)
前端·javascript·vue.js
醉の虾34 分钟前
Vue3 使用v-for 渲染列表数据后更新
前端·javascript·vue.js
张小小大智慧43 分钟前
TypeScript 的发展与基本语法
前端·javascript·typescript
幼儿园的小霸王2 小时前
通过socket设置版本更新提示
前端·vue.js·webpack·typescript·前端框架·anti-design-vue
疯狂的沙粒2 小时前
对 TypeScript 中高级类型的理解?应该在哪些方面可以更好的使用!
前端·javascript·typescript
周末不下雨2 小时前
win11+ubuntu22.04双系统 | 联想 24 y7000p | ubuntu 22.04 | 把ubuntu系统装到1T的移动固态硬盘上!!!
linux·运维·ubuntu
旭日猎鹰3 小时前
Flutter踩坑记录(二)-- GestureDetector+Expanded点击无效果
前端·javascript·flutter