tsconfig之strict严格模式相关

strict 作用

TypeScript 中的严格模式跟 JavaScript 中说的严格模式(即 use strict)不是一个概念,它表示是否开启下面一系列的类型检查规则:

"noImplicitAny": true,
"strictNullChecks": true, 
"strictFunctionTypes": true,
"strictBindCallApply": true,
"strictPropertyInitialization": true,
"noImplicitThis": true,
"alwaysStrict": true
  • 如果你设置 stricttrue 的话,那么上面所有的配置默认全是 true
  • 如果你设置 strictfalse 的话,那么上面的所有配置默认全是 false
  • 你如果既设置了 strict 又单独设置了其中的部分配置,那么以单独设置的配置为准

strictNullChecks

默认情况下,nullundefined 可以被赋值给其它任意类型,因为 nullundefined 是任何类型的子类型。

strictNullChecks 配置为 false 时,下面的代码不会提示报错。

let age: number = undefined
age = null
age = 18
age = undefined
export {}

strictNullChecks 配置为 true 时,上面的代码会提示报错,
它告诉我们不能将 undefined 赋值给 number 类型。

TS2322: Type 'undefined' is not assignable to type 'number'.

当我们开启 strictNullChecks 时,nullundefined 就不能赋值给任何类型了,对于它们的校验相当于开启了严格模式

noImplicitAny

如下代码,我们定义了一个函数 test,并且它有一个参数 a,但是我们并没有显式的给 a 定义类型,这时 typescript 将自动推导 a 的类型为 any,
相当于给 a 隐式的加了 any 类型。

如果 noImplicitAny 配置为 false,下面这段代码能够正常运行,但当我们给 noImplicitAny 配置为 true 时,下面这段代码将提示 TS7006: Parameter 'a' implicitly has an 'any' type.

export function test (a) {
	return a
}

strictFunctionTypes

严格函数类型检查

如下代码

export const x: number | string = Math.random() > 0.5 ? '2020' : 2021;
const y: number = x;

number | string 类型的 x 赋值给 number 类型的 y 这是不被允许的

但是在函数中,这种形式却是可以的,回调函数中的 date 参数是 number | string 类型的,但是调用时,datestring 类型的,
strictFunctionTypes 没有开启时,typescript 认为是没有问题的

export function getCurrentYear(callback: (date: string | number) => void) {
  callback(Math.random() > 0.5 ? '2020' : 2020);
}

getCurrentYear((date: string) => {
  console.log(date.charAt(0));
});

如果开启 strictFunctionTypestrue,报错如下

strictBindCallApply 作用

严格绑定检查。意思是在使用 bindcallapply 语法的时候,是否进行参数检查

示例

如下代码,当 strictBindCallApply 未开启时,typescript 认为下列代码没有错误,但实际上,fnn 的两个参数都是必传的,显然这种提示是不合理的。

export function fnn (name: string, age: number) {
	return name + age;
}

fnn.call(null, 'wfly');
fnn.apply(null, ['wfly']);
fnn.bind(null, 'wfly')();

当我们设置 strictBindCallApplytrue 时,typescript 会对这种参数缺少进行报错,如下图所示

strictPropertyInitialization

该选项用于检查类的属性是否被初始化,如果开启则必须进行初始化,开启此属性需要 strictNullChecks 一并开启

示例

如下代码,当 strictPropertyInitialization 未开启时,此代码不会提示报错

export class Person {
	name: string;
}

strictPropertyInitialization 开启时,会提示 TS2564: Property 'name' has no initializer and is not definitely assigned in the constructor.

正确写法,给 name 赋一个初始值

export class Person {
	name: string = '';
}

noImplicitThis

是否允许出现隐式 any 类型的 this

示例

如下代码,getName 函数返回值是一个函数,其中这个函数的返回值中用到了 this,这个 this 是未知的, 当 noImplicitThis 未开启时,此代码不会提示报错

export class Person {
	name = '';
	
	constructor (_name: string) {
		this.name = _name;
	}
	
	getName () {
		console.log(this, this.name);
		return function () {
			console.log(this.name);
		};
	}
}

new Person('小明').getName().call({ name: '小红' });

noImplicitThis 开启时,会提示如下报错

alwaysStrict

是否开启严格模式,开启的话编译后的 js 会带上 use strict,之前是 js 文件的会带上,ts 编译为 js 没有带上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wflynn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值