TypeScript 严格模式有多严格?

大家好,我是 CUGGZ。,TypeScript 是微软于 2012 年推出的一门语言,它是 JavaScript 的超集,具有更强的可选类型系统。TypeScript 和 JavaScript 一样是有严格模式的,今天就来看看 TypeScript 中的严格模式如何开启,以及它到底有多严格!,TypeScript 的配置项都写在项目根目录名为 tsconfig.json 的配置文件中,可以通过以下方式来开启严格模式:,TypeScript 编译器有超过 90 个不同的配置项。其中 7 个是关于严格模式的:,当在 tsconfig.json 中开启严格模式之后,就相当于开启了这些配置:,下面就来分别看一下这些选项都有什么含义。,此规则不允许变量或函数参数具有隐式 any 类型。来看下面的例子:,当启用了严格模式时,函数参数 number 就报错了:,要想修复这个报错,只需给参数或变量显式指定类型:,因此 noImplicitAny 规则可以确保代码更具可读性。否则,add10 函数的调用者需要推断参数是一个数字,那使用 TypeScript 还有什么意义呢?,此规则不允许 this 隐式定义上下文。来看下面的例子:,当启用了严格模式时,getBodyMassIndex 中的 this 就报错了:,解决这个问题的方法就是使用箭头函数,因为箭头函数使用其父级的执行上下文:,此规则指定始终以严格模式检查每个模块,并且在编译之后的 JavaScript 文件中加入”use strict”,用来告诉浏览器该 JavaScript 为严格模式。,ECMAScript 严格模式是在 ES5 中引入的,它只是向编译器提示代码应该以严格模式执行,使用严格模式可以使代码更以更安全、高效的方式运行。,此规则可以确保使用具有正确参数的 call()、bind() 和 apply() 函数。来看下面的例子:,当启用了严格模式时,getBodyMassIndex 中的 this 就报错了:,当遇到这种报错时,只需检查函数调用的参数,并使用正常的方式调用:,此规则使得 null和 undefined 值不能赋值给非这两种类型的值,别的类型的值也不能赋给它们。除了 any 类型,还有个例外就是 undefined 可以赋值给 void 类型。这个选项可以帮助 Uncaught TypeError 错误。来看下面的例子:,当启用了严格模式时,打印 book.name 时就报错了:,如果未开启严格模式,即使 book.name 可能未定义,此代码也会编译。想要修复这个问题,就需要为要编译的代码添加 null 检查:,函数中也是一样的,来看下面的例子:,如果启用了严格模式时,调用 logBookName(book); 时就会报错:,这里提供两种解决方案:,使用该规则时,可以强制开发人员编写具有更好类型描述的代码。,此规则将强制在构造函数中初始化所有属性值。来看下面的例子:,在上面的代码块中有一个 User 类,constructor() 方法是初始化其实例属性的地方。当实例化一个类对象时,JavaScript 会自动调用 constructor() 方法。Typescript 要求要么初始化定义的属性,要么指定一个 undefined 类型。因此,当编译上面的代码时,将会提示以下错误:,对于上面的代码,可以这样改:,此规则会更彻底地检查函数参数。Typescript 参数默认是双向协变的,这意味着它们既可以是协变的,也可以是逆变的。方差是一种深入了解子类型关系的方法。当参数是协方差时,我们可以将特定类型分配给更广泛的类型(例如将子类型分配给超类型)。逆变是相反的:可以将更广泛的类型分配给特定类型(例如将超类型分配给子类型)。,上面的代码运行时并没有提示错误,默认情况下参数是双向协变比较的。超类型 getAnimalName 和子类型 getDogName 的方法可以相互分配。当开启严格模式之后,则 TypeScript 的参数进行逆变比较。,当开启严格模式时,最后一行将报以下错误:,这里,getAnimalName 是比 getDogName 更广泛的函数。因此,在这种情况下,无法将超类型分配给子类型。但是,可以将子类型分配给超类型。大多数时候,函数参数应该是逆变的,而不是双向协变的。如果开启严格模式,Typescript 将不会将函数参数视为双向协变。

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/19123.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月5日 上午12:00
下一篇 2023年3月7日 下午10:34