TypeScript 基础 — Null 和 Undefined

这篇博客探讨了TypeScript中与Null和Undefined相关的概念,包括可选链操作符用于安全地访问可能不存在的对象属性,空值合并运算符提供默认值以防遇到Null或Undefined,空断言运算符强制忽略潜在的Null或Undefined值,以及如何处理数组边界以避免未定义的访问。文章强调在启用strictNullChecks时,这些特性的重要性更加突出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nullundefined 都有各自的类型名称。这些类型本身没有用处,因为我们只能将 nullundefined 赋值给定义为 nullundefined 类型的变量。

let u: undefined = undefined
u = 'string' // compile error

let n: null = null
n = 43 //compile error

默认情况下,nullundefined 是所有类型的子类型。 就是说可以把 nullundefined 赋值给 number 类型的变量。

let value: string | undefined | null = null
value = 'hello'
value = undefined

注意:默认情况下,将禁用 nullundefined 处理,我们可以通过在 tsconfig.json 文件将 strictNullChecks 设置为 true 来启用。当启用 strictNullChecks 时,本文的示例才能正常运行。

可选链

可选链接是一种 JavaScript 功能,它与 TypeScript 的空处理配合得很好。它允许使用紧凑的语法访问对象上的属性,这些属性可能存在,也可能不存在。它可以和 ?.(可选链)运算符访在问属性时一起使用。

interface User {
  name: string
  address?: {
    street: string
  }
}

function printStreet(user: User) {
  const streetInfo = user.address?.street
  if (streetInfo === undefined) {
    console.log('No street info')
  } else {
    console.log(streetInfo)
  }
}

let user: User = {
  name: 'O.O'
}

printStreet(user) // 'No street info'

空值合并

空值合并是另一个 JavaScript 特性,它也可以很好地与 TypeScript 的空处理配合使用。

它允许编写在处理 nullundefined 时有回退的表达式。当表达式中可能出现其他 falsy 值,但这些值仍然有效时,这非常有用。

它可以与表达式中的 ??(空值合并运算符)一起使用,类似于使用 &&(与运算符)

function printName(name: string | null | undefined) {
  console.log(`${name ?? '无名氏'}`)
}

printName(null) // '无名氏'
printName('O.O') // 'O.O'

空断言

TypeScript 的推理系统并不完美,有时候忽略一个值为 nullundefined 的可能性是有意义的。一个简单的方法就是使用类型转换,但是 TypeScript 也提供了 ! 运算符作为方便的快捷方式。

function getValue(): string | undefined {
  return 'hello'
}

let value = getValue()

value.length // value 可能为 undefined
// 使用 ! 运算符
value!.length // 5

就像类型转化一样,这可能是不安全的,应该小心使用。

数组边界处理

即使启用了 strictNullChecks,默认情况下 TypeScript 也会假定数组访问永远不会返回 undefined(除非 undefined 是数组类型的一部分)。

let array: number[] = [1, 2, 3]
let value = array[0] // value 的类型为 number

我们可以配置 noUncheckedIndexedAccess 来更改此行为。

let array: number[] = [1, 2, 3]
let value = array[0] // value 的类型为 number | undefined
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值