TypeScript 基础 — Null 和 Undefined

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
01Typescript介绍 、Typescript安装、Typescript开发工具(15分51秒).rar 02 Typescript 中的数据类型 boolean 数字类型 number类型 string类型 array类型元组类型 (tuple)枚举类型 (enum) (上) (20分29秒).rar 03 Typescript中的数据类型 任意类型 (any) nullundefined void类型 never类型 (下) (16分6秒).rar 04 Typescript中的函数 函数的定义 可选参数 默认参数 剩余参数 函数重载 箭头函数 (31分50秒).rar 05 Typescript中的类 Es5中的类和静态方法 继承 (原型链继承、对象冒充继承、原型链+对象冒充组合继承) (20分40秒).rar 06 Typescript中的类 类的定义 继承 类里面的修饰符 (上) (29分4秒).rar 07 Typescript中的类 类中的静态属性 静态方法 抽象类 多态 (下) (27分52秒).rar 08 Typescript中的接口的用途 以及属性类型接口 (19分46秒).rar 09 Typescript中的属性类型接口【案例】 定义Ajax请求数据的接口 ts封装ajax (8分).rar 10 Typescript中的函数类型口 【案例】 加密方法约束 (5分11秒).rar 11 Typescript中的可索引接口 类类型接口 (12分2秒).rar 12 Typescript中接口扩展、接口的继承 (7分19秒).rar 13 Typescript中的泛型 泛型变量 泛型类 (22分54秒).rar 14 Typescript的泛型接口 泛型类接口 (8分42秒).rar 15 Typescript泛型类 - 把类作为参数类型的泛型类 (21分47秒).rar 16 Typescript 类型、接口、类 、泛型 综合使用--Typescript封装统一操作Mysql Mongodb Mssql的底层类库 (14分31秒).rar 17 Typescript 模块 以及模块化封装DB库 封装类似Mongoose风格的类库 (25分22秒).rar 18 命名空间 命名空间块化 (11分35秒).rar 19 装饰器定义 类装饰器 属性装饰器 装饰器工厂 (23分17秒).rar 20 装饰器 方法装饰器 方法参数装饰器 装饰器的执行顺序 (28分39秒
TypeScript中,strictNullChecks是一个编译选项,用于强制检查nullundefined的类型。当strictNullChecks设置为true时,变量的类型不能为nullundefined,除非明确地将其包含在允许这些类型的联合类型中。引用\[1\]中的代码示例展示了在strictNullChecks为true时,如何声明变量为nullundefined,并且编译通过。例如,可以使用let userName: null; userName = null;来声明一个变量为null。同样,可以使用let age: undefined; age = undefined;来声明一个变量为undefined。这些代码在strictNullChecks为true时是合法的。 要在TypeScript中启用strictNullChecks,可以通过两种方式进行设置。一种方式是通过VS Code的设置界面进行设置,具体步骤是:打开文件->首选项->设置,然后搜索strict Null Checks,找到对应的选项进行勾选即可。另一种方式是通过编辑settings.json文件进行设置,具体步骤是:在settings.json文件中添加"js/ts.implicitProjectConfig.strictNullChecks": true。引用\[2\]提供了这种设置的示例。 然而,引用\[3\]中的代码示例展示了在strictNullChecks为true时,无法编译通过的情况。例如,let userName: string; userName = "搞前端的半夏";是合法的,因为字符串类型可以赋值给userName变量。但是,userName = null;和userName = undefined;是不合法的,因为在strictNullChecks为true时,变量的类型不能为nullundefined。 综上所述,strictNullChecks是TypeScript中的一个编译选项,用于强制检查nullundefined的类型。当strictNullChecks为true时,变量的类型不能为nullundefined,除非明确地将其包含在允许这些类型的联合类型中。 #### 引用[.reference_title] - *1* *3* [TypeScript 2.0开启空值的严格检查](https://blog.csdn.net/devcloud/article/details/123503845)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [vscode 编辑器的 TypeScript 检查如何全局打开 strictNullChecks](https://blog.csdn.net/weixin_44067191/article/details/119923325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值