TypeScript 空安全终极指南

做前端开发的同学一定都很熟悉 TypeScript,它是一种被广泛运用的编程语言,它的主要目的是在 JavaScript 范畴内改进生产力和代码的可维护性。

在 TypeScript 4.0 版本推出,空安全特性受到了广泛的好评。空安全指的是程序使用的变量都能被 TypeScript 正确地定义是否为 null 或 undefined。这个特性可以避免运行时无效的函数调用、报错和程序运行不稳定等问题。

如果你是 TypeScript 的初学者,本文将对 TypeScript 空安全特性进行详细介绍和指导。如果你是有一定经验的开发者,那么你也可以再次强化你的基础知识,并学会如何有效地使用 TypeScript 空安全特性。

为什么需要 TypeScript 空安全?

在 JavaScript 中,未初始化的变量默认值是 undefined,而未赋值的变量默认值是 null。

下面是一个简单的示例

--- -- ------ - ---------   -- --
--- -- ------ - ----        -- --

在 JavaScript 中,这是没有问题的。

但是在 TypeScript 中,这回导致很多问题,比如使用变量但它的值为 null 或 undefined 时,程序不会报错。这会带来那程序偏移、调试困难等弊端。

因此,TypeScript 引入了 null 和 undefined 类型,为了避免这些问题和获得编写更安全的具有可读性的代码。

TypeScript 空安全默认关闭

在 TypeScript 中,默认情况下 TypeScript 空安全特性是关闭的。这意味着变量的类型可以是 null 或 undefined。

下面是一个简单示例:

--- ---- ------ - -----
--- - ----    -- --
--- - ---------  -- --

上面的这个示例中,将 foo 赋值为 null 或 undefined 是可行的。

如果你希望 TypeScript 严格控制 null 或 undefined 的使用,你需要启动 TypeScript 的空安全模式。

TypeScript 空安全模式

要打开 TypeScript 的空安全模式,你需要在 tsconfig.json 中设置 strictNullChecks 选项,如下所示:

-
  ------------------ -
    --------- -----
    ------------------- ----
  -
-

在启动了空安全模式之后,你需要在 TypeScript 中添加明确的 null 或 undefined 类型声明才能使用它们。

以下三种情况你需要显式地声明变量的类型,避免 TypeScript 的这种行为:

  1. 当你声明一个变量并在后续的代码中使用它
  2. 当你将一个对象分配到一个变量并用它做进一步的操作
  3. 当你写一个函数并且你需要声明函数的参数和返回值

下面是一个简单的示例:

--- ---- ------ - ---- - --------- - ----
--- - -----
--- - ---------   -- --

--- ---- -------- - --------- - --- -- --
--- - ---------   -- --

-------- ------ ------- -- -------- ------ -
  ------ - - -
-

在上面的这个示例中,变量 foo 显式声明了它可以是 null 或 undefined,在启动空安全模式之后,我们需要明确的声明变量。

接下来,变量 arr 显式声明了它的类型可以是数组或 undefined。

最后, sum 函数在声明它的类型、参数和返回值(这是不必须的,但好的实践)。

TypeScript 空安全注意事项

在使用 TypeScript 空安全时,你需要注意一下几点:

  1. 你需要在运行 TypeScript 代码之前编译它
  2. 确保你清楚地声明 null 或 undefined 属性或变量
  3. 请避免使用 any 类型,这样会使 TypeScript 的 null/undefined 检查无效

在 TypeScript 4.0 之前,您需要显式地声明一个可空值(使用 null 或 undefined ),否则 TypeScript 将会调用运行时错误。

但在 TypeScript 4.0 引入了可选链式语法,你可以通过这个新特性来避免这种错误:

--------- ---- -
  --------- -
    -------- -
      ----- ------
    -
  -
-

----- ----- ---- - --

----------------------------------------   -- ---- -- ------ ----------

在上面的这个示例中,我们定义了一个名为 User 的接口,该接口有一个可选属性 address,其中有一个可选属性 street,它有一个 name 属性。

在 user 对象中,我们没有定义任何属性。但是,在打印 user 的 address、streets、name 时,TypeScript 不会抛出任何错误。这是可选链式语法的功劳。

TypeScript 空安全练习

我们来看一个实战示例。假设我们正在通过 API 获取用户信息并打印在页面上:

--------- ---- -
  --- ------
  ----- ------
  ------ ------
  -------- -------
  ------ ------ - ----
  ---------- ----
  ---------- ----
-

----- -------- ------------- -------- ------------- -
 ----- -------- - ----- ---------------------
 -- -------------- -
   ----- --- ------------ --- ----- ------
 -
 ----- -------- - ----- ---------------
 ------ --------
-

-------- --------------- ----- -
  ---------------- ------------
  ------------------ --------------
  ------------------- ---------------
  -- ----------- --- ----- -
    ------------------- ---------------
  -
  --------------- ------ -----------------
  -------------------- --- ---------------------------------
  -------------------- --- ---------------------------------
-

----- -------- -------- ------- -
  --- -
    ----- ---- - ----- -------------
    ---------------
  - ----- ------- -
    --------------------
  -
-

-------

在这个示例中,我们定义了一个名为 User 的接口,它定义了用户的各个属性。

接下来,我们定义了一个函数 fetchUser,使用它我们可以获取给定 id 的用户数据。

接下来使用 printUser 函数,将用户数据打印在控制台中。

我们使用了 TypeScript 的可空类型以避免使用 null 变量,并使用 try/catch 捕获异常。如果你没有启动 TypeScript 的空安全模式,代码就会编译成功,但在运行时会出现错误。

总结

TypeScript 的空安全特性可以有效的避免许多问题。

在这篇文章中,我们介绍了 TypeScript 空安全的基本概念和理念,如何在项目中启用 TypeScript 空安全模式,以及空安全可能遇到的问题和注意事项。

如果你想开始在你的项目中使用 TypeScript 空安全模式,我们强烈建议你好好阅读本文,用 TypeScript 空安全创造更加安全的程序。

最后,我们为你准备了一个练习,希望这个练习可以帮助你更好的理解 TypeScript 空安全的用法。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/645ca263968c7c53b0f10035


猜你喜欢

  • 如何在 Material Design 中制作动态 BarChart 图表

    BarChart 图表是一个常见的数据可视化形式,它可以帮助我们更直观地理解数据之间的关系和变化。在 Material Design 中,我们可以通过使用一些简单的技术来制作动态的 BarChart ...

    1 年前
  • CSS Grid 中的行高问题及其解决方案

    在前端开发中,CSS Grid 是一种非常强大的技术,它能够将页面布局变得更加简单和灵活。但是在实际开发中,我们可能会遇到一些行高方面的问题。这篇文章将会介绍 CSS Grid 中的行高问题,并提供一...

    1 年前
  • 如何使用 Docker 部署基于 Flask 的 Web 应用

    在开发基于 Flask 的 Web 应用时,部署和运行环境的配置往往是一个繁琐且耗时的过程。使用 Docker 技术可以使这个过程变得简单和快捷。本文将详细介绍如何使用 Docker 部署基于 Fla...

    1 年前
  • PM2 进程守护机制实现原理详解

    在前端开发过程中,我们会经常遇到需要长时间运行的 Node.js 应用程序,例如 Web 服务、API 服务器、定时任务等,这些应用程序需要持续运行,保持监听服务,同时还需要保证程序的稳定性和可靠性,...

    1 年前
  • Mocha 测试框架中的 UI 自动化测试

    随着前端技术的发展,Web 应用的界面也越来越复杂,而为了保证软件的质量,我们需要使用测试框架来保证应用的正确性。在这种情况下,Mocha 被广泛使用,并且成为了前端开发中最受欢迎的测试框架之一。

    1 年前
  • MongoDB 查询问题记录

    介绍 MongoDB 是一款非常流行的 NoSQL 数据库,在前端开发中使用广泛。在 MongoDB 中,查询是非常重要的操作之一,因为它可以用来获取数据以及在数据中搜索特定的内容。

    1 年前
  • Babel 编译参数 cacheDirectory(缓存编译可加速开发)

    前言 在前端开发中,Babel 是我们必不可少的工具。它可以将 ES6/ES7 的新语法转译成 ES5 语法,让我们能够使用最新的 JavaScript 语言特性来开发 Web 应用程序。

    1 年前
  • Cypress 测试中如何进行性能优化

    Cypress 测试中如何进行性能优化 Cypress 是一个功能强大的前端测试工具,它提供了一套完整的 API 来模拟用户行为,比如点击、输入、等待和断言等等。Cypress 的优点在于它的自动化测...

    1 年前
  • Promise 和回调函数的对比和优劣

    在前端开发中,我们经常会使用异步编程来处理一些需要等待时间的操作。在异步编程中,回调函数是一种常用的方式。但是回调函数的嵌套很容易导致代码的可读性和可维护性下降。这时,Promise 就出现了。

    1 年前
  • GraphQL 抛出非空字段错误的解决方案

    前言 GraphQL 是一种用于构建 API 的查询语言,它是由 Facebook 开发的一种新兴技术。GraphQL 在解决 RESTful API 中出现的一些问题时表现出了非常好的性能。

    1 年前
  • Jest 测试 React 组件,如何 mock 路由?

    前言 在 React 的开发中,我们使用 Jest 进行单元测试是很常见的做法。在测试中,我们通常会需要模拟一些外部依赖或者环境变量,以便能够更加控制测试场景。其中,mock 路由也是一个常见的需求。

    1 年前
  • 使用 Angular 和 Firebase 构建现代 Web 应用程序

    前言 随着 Web 技术的快速发展,现代 Web 应用程序的架构和开发方式也在快速变化。使用 Angular 和 Firebase 结合构建 Web 应用程序,已成为现代 Web 开发的趋势。

    1 年前
  • 解决 RESTful API 中的数据压缩问题

    在 web 应用程序中,RESTful API 是一种常见的且高效的方式,可以让前端与后端之间的通信变得简单、快速。然而,RESTful API 中的数据传输可能会遇到数据过大的问题,这时我们可以使用...

    1 年前
  • ES12 可空链式调用「?.」:怎样避免 undefined 属性错误

    在前端开发过程中,经常会遇到访问 undefined 属性的错误。为了避免这些错误,我们通常需要在代码中添加许多的判断语句。ES12 可空链式调用「?.」这一新特性的出现,为我们解决了这一问题,极大地...

    1 年前
  • 使用 Angular 创建 Web Components 的技巧

    Web Components 是一项新的 Web 技术,可以将可复用的组件打包成一个独立的模块,让其他开发人员或者团队使用。使用 Web Components 可以减少代码冗余和开发时间,提高组件的可...

    1 年前
  • 使用 Server-sent Events 实现实时订单处理系统

    在 Web 应用程序中,有时需要在服务器端发出实时通知,以便客户端接收并处理数据。这类通知通常被称为服务器推送 (Server Push) 或一些 Websockets 技术。

    1 年前
  • Socket.io 中如何获取客户端的 IP 地址

    在使用 Socket.io 进行服务器与客户端通信的时候,了解客户端的 IP 地址对于定位问题及进行一些安全控制非常重要。本文将介绍如何在 Socket.io 中获取客户端的 IP 地址,希望能对前端...

    1 年前
  • Mongoose 中使用 Array 类型的方法详解

    Mongoose 中使用 Array 类型的方法详解 在 Mongoose 中,Array 类型是一个非常常见的数据类型,它通常被用于存储多个数据的列表或集合。而这个类型有着非常强大而丰富的方法,本文...

    1 年前
  • Redis 集群节点故障恢复机制解析

    前言 Redis 是一款高性能的内存数据库,其集群模式可以将数据分片存储在多个节点,以提高系统的可用性和性能。在 Redis 集群中,节点故障是不可避免的情况,因此我们需要了解 Redis 集群的节点...

    1 年前
  • 如何在 Chai.js 中使用 not 断言

    在前端开发中使用断言库是非常常见的,因为它们可以帮助我们检测代码中的错误和异常,提高代码的健壮性和可维护性。其中,Chai.js 是一个流行的断言库,它提供了很多有用的功能和 API,其中 not 断...

    1 年前

相关推荐

    暂无文章