摘要:在编程过程成空指针是最常见的bug之一,但是在TypeScript中我们无法使用具体的类型来表示特定的变量不能为空!幸运的是,TypeScript 2.0 解决了这个问题。

本文分享自华为云社区《TypeScript开启严格空值检查》,作者:搞前端的半夏。

在TS中,有对应JS中的基础类型null和undefined。

TypeScript里,JS中的基本数据类型undefined和null两者各自有自己的类型分别叫做undefined和null。

let u: undefined = undefined;
let n: null = null;

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

例如下面的代码,在TS中是完全可以执行的。

let userName: string;
userName = "搞前端的半夏"; // OK
userName = null; // OK
userName = undefined; // OK let age: number;
age = 18; // OK
age = null; // OK
age = undefined; // OK let isBoy: boolean;
isBoy = true; // OK
isBoy = false; // OK
isBoy = null; // OK
isBoy = undefined; // OK

在编程过程成空指针是最常见的bug之一,但是在TypeScript中我们无法使用具体的类型来表示特定的变量不能为空!幸运的是,TypeScript 2.0 解决了这个问题!。

strictNullChecks

TypeScript 2.0 增加了对不可为空类型的支持。有一种新的严格空值检查模式,他提供了strictNullChecks

来限制对空值的检查。可以通过在命令行上添加--strictNullChecks参数来启功严格空值检查。也可以在项目的tsconfig.json文件中启用strictNullChecks编译器选项。

在TS中,为了各版本的兼容,strictNullChecks的默认值是false

{
"compilerOptions": {
"strictNullChecks": true
// ...
}
}

在TS官方的演练场中你可以勾选strictNullChecks来启用严格空值检查!

注意点1

在严格空值检查模式下,null和undefined无法赋值给其他类型的变量。

例如下面的代码在*strictNullChecks=true下,是无法编译通过的。

let userName: string;
userName = "搞前端的半夏"; // OK
userName = null; // OK
userName = undefined; // OK

注意点2

严格空值检查并不意味着变量的类型无法设置为null和undefined

例如下面的代码在*strictNullChecks=true下,正常编译通过的。

let userName: null;
userName = null; let age: undefined;
age = undefined;

变量如何可以为空

在正常的编程中,我们并不会直接将一个变量的类型设置为null或者undefined,例如username,我们通常设置为string类型。

如果我们想要username可以接受空值我们该怎么办呢?

1. 使用联合类型

联合类型(Union Types)表示取值可以为多种类型中的一种。

对于下面的代码,userName可以接受null类型的值。但是无法接受undefined的值

let userName: string | null;
userName = "搞前端的半夏"; // OK
userName = null; // OK
userName = undefined; // Error

2. a? 默认undefined

联合类型可以在Object中使用

type User = {
name: string ;
age:number | undefined
};

这里我们设置age的类型为number和undefined。

下面的两种用法都是正确的。

let user1: User = { name: "搞前端的半夏", age: undefined };
let user2: User = { name: "搞前端的半夏", age: 18 };

如果我们想要下面的效果,不需要手动给age赋值

let user2: User = { name: "搞前端的半夏"};

此时我们就需要用到**?**来使属性成为可选,这样我们就可以完全省略age属性的定义。

type User = {
name: string ;
age?:number
};

请注意,在这种情况下:undefined类型会自动添加到联合类型中。因此,以下所有赋值都是正确的:

let user1: User = { name: "搞前端的半夏", age: undefined };
let user2: User = { name: "搞前端的半夏", age: 18 };
let user3: User = { name: "搞前端的半夏"};

安全检查

变量可空的安全检查

如果变量的类型包含nullor undefined,则访问任何属性都会产生编译时错误:

function UserNameLength(userName: string | null) {
return userName.length;
}

所以在访问属性之前,必须要先判断变量的值是否为空!

function UserNameLength(userName: string | null) {
if (userName === null) {
return 0;
} return userName.length;
}

#可空类型的函数调用

在JS中支持回调函数,所以函数的参数会可能是函数类型,

function fn(callback?: () => void) {
callback();
}

如果该参数是可选的函数类型,TS会将该参数加上undefined类型。

那么这个函数的我们在调用函数的时候会报错!

类似于在访问属性之前检查对象,我们需要首先检查函数是否具有非空值:

function fn(callback?: () => void) {
if (callback) {
callback();
}
}

点击关注,第一时间了解华为云新鲜技术~

TypeScript 2.0开启空值的严格检查的更多相关文章

  1. TypeScript 2.0候选版(RC)已出,哪些新特性值得我们关注?

    注:本文提及到的代码示例下载地址 - Runnable sample to introduce Typescript 2.0 RC new features 作为一个Javascript的超集, Ty ...

  2. 整整十年 - Agent Framework for TypeScript 2.0

    十年前,我发布了 Agent Framework for .NET 2.0 今天,Agent 又开始了新的旅程, 这次支持的语言是 TypeScript 2.0 上需求:init函数只能被调用一次 废 ...

  3. 在 Typescript 2.0 中使用 @types 类型定义

    在 Typescript 2.0 中使用 @type 类型定义 基于 Typescript 开发的时候,很麻烦的一个问题就是类型定义.导致在编译的时候,经常会看到一连串的找不到类型的提示.解决的方式经 ...

  4. IIS6.0开启gzip压缩(来自百度)

    IIS6.0开启gzip压缩 | 更新:2012-08-10 10:29 1 2 3 4 5 分步阅读 开启gzip可以极大的加速网站.有时压缩比率高达80%,近来测试了一下,最少都有40%以上,还是 ...

  5. Saiku导出excel指标列无线条以及0与空值显示问题(三十二)

    Saiku导出excel指标列无线条以及0与空值显示问题 描述: 数据库中字段值为0 ,与数据库中字段值为 null 时 ,saiku会将为0 以及为 null 的数据都不展示出来,但是我们其实希望数 ...

  6. thinkphp6.0 开启调试模式以及Driver [Think] not supported

    thinkphp6.0 开启调试模式 首先确认自己是通过 composer 进行的下载,然后修改系统目录下的 .example.env 为 .env 文件 修改 config->app.php ...

  7. TypeScript 2.0 正式发布

    9 月 22 日,TypeScript 2.0 正式发布了. TypeScript 是微软开发的开源的编程语言,主要负责人是 C# 之父 Anders Hejlsberg. TypeScript 成功 ...

  8. TypeScript 4.0 New Features

    TypeScript 4.0 New Features $ npm install typescript@beta https://devblogs.microsoft.com/typescript/ ...

  9. 安装typescript环境并开启VSCode自动监视编译ts文件为js文件

    一.前言 小编最近开始学习typescript,懂得人都知道,typescript是vue3的基础伴生,配合更加默契.就像vue2和js一样!typescript不像js那样浏览器直接可以解读,需要我 ...

随机推荐

  1. python--003 数据类型

    运算符 in "heilo" in "adfsdfsdfsdfsdfdsfdshellofsdfdsf" "li"  in ["l ...

  2. CentOS7安装部署Prometheus+Grafana (转)

    转自:https://www.jianshu.com/p/967cb76cd5ca 作为监控系统的后起之秀,prometheus的安装可谓非常简单,不需要第三方的依赖(数据库.缓存.PHP之类的).下 ...

  3. Java 数组存储机制

    数组是一种引用类型. 数组用来存储类型相同的一组数据,一旦初始化完成,其所占的空间也确定下来了,即使清除某个元素,其所占用的空间仍然存在,即,数组的长度不能被改变,且数组只有在分配空间后才能使用. 数 ...

  4. docker容器编排 (4)

    容器编排 我们的项目可能会使用了多个容器,容器多了之后管理容器的工作就会变得麻烦.如果要对多个容器进行自动配置使得容器可以相互协作甚至实现复杂的调度,这就需要进行容器编排.Docker原生对容器编排的 ...

  5. Solution -「多校联训」Sample

    \(\mathcal{Description}\)   Link   (稍作简化:)对于变量 \(p_{1..n}\),满足 \(p_i\in[0,1],~\sum p_i=1\) 时,求 \(\ma ...

  6. python2写ping监控,自动发现ip

    玩了hostmonitor,老外写的很好.但是不符合国情,只有邮件适合发送. 今天用python 写一个自动发现ip,ping失败报警的程序.(微信和邮件报警) 以前用python写的发微信,发邮件直 ...

  7. windows清理用户痕迹

    1.日志管理器的基本使用 在这里创建自定义视图是非常重要的 在设置自定义视图不必设置的事件日志选项太多,可以按日志也可以按源进行设置,根据自己的情况来做决定 在cmd下可以使用wevtutil cl ...

  8. scrapy的介绍、组件、数据流

    scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量代码,就能够快速的抓取到数据内容. scrapy使用了twisted异步网络框架来处理网络通讯,来加快我们的下载速 ...

  9. 配置IPv6地址跳变——网络测试仪实操

    第一部分:什么是IPv6地址跳变? IPv6地址跳变是指IPv6地址进行一系列有规则的变化,Renix支持对IPv6地址进行递增.递减.列表和随机变化. 如当用户想要仿真大量的源IPv6地址变化的数据 ...

  10. 技术小白的也能独立完成数据分析,这款BI系统你值得拥有

    是否有很多小白跟我一样,不会编程代码,又觉得excel操作太繁琐了,一直苦苦不知道要怎么做数据分析.前段时间我使用了一款bi系统,简直太方便了!拖拉拽就能制作分析图表.点击就能应用智能分析功能,如果这 ...