广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >详解Typescript 严格模式有多严格
  • 444
分享到

详解Typescript 严格模式有多严格

Typescript 严格模式Typescript 模式 2023-01-29 15:01:34 444人浏览 泡泡鱼
摘要

目录正文noImplicitAnynoImplicitThisalwaysStrictstrictBindCallApplystrictNullChecksstrictPropert

正文

typescript 是微软于 2012 年推出的一门语言,它是 javascript 的超集,具有更强的可选类型系统。TypeScript 和 JavaScript 一样是有严格模式的,今天就来看看 TypeScript 中的严格模式如何开启,以及它到底有多严格!

TypeScript 的配置项都写在项目根目录名为 tsconfig.JSON 的配置文件中,可以通过以下方式来开启严格模式:

{
  ...
  "compilerOptions": {
    "strict": true,
    ...
  },
  ...
}

TypeScript 编译器有超过 90 个不同的配置项。其中 7 个是关于严格模式的:

  • noImplicitAny
  • noImplicitThis
  • alwaysStrict
  • strictBindCallApply
  • strictNullChecks
  • strictPropertyInitialization
  • strictFunctionTypes

当在 tsconfig.json 中开启严格模式之后,就相当于开启了这些配置:

{
  ...
  "compilerOptions": {
    "noImplicitAny": true,
    "noImplicitThis": true,
    "alwaysStrict": true,
    "strictBindCallApply": true,
    "strictNullChecks": true,
    "strictFunctionTypes": true,
    "strictPropertyInitialization": true,
    ...
  }
  ...
}

下面就来分别看一下这些选项都有什么含义。

noImplicitAny

此规则不允许变量或函数参数具有隐式 any 类型。来看下面的例子:

const add10 = number => number + 10;

当启用了严格模式时,函数参数 number 就报错了:

参数“number”隐式具有“any”类型。ts(7006)

要想修复这个报错,只需给参数或变量显式指定类型:

const add10 = (number: number) => number + 10;

因此 noImplicitAny 规则可以确保代码更具可读性。否则,add10 函数的调用者需要推断参数是一个数字,那使用 TypeScript 还有什么意义呢?

noImplicitThis

此规则不允许 this 隐式定义上下文。来看下面的例子:

class Person {
  weight: number;
  height: number; 
  constructor(weight: number, height: number) {
    this.weight = weight;
    this.height = height;
  } 
  getBodyMassIndex() {
    return function () {
      return this.weight / (this.height * this.height);
    };
  }
}

当启用了严格模式时,getBodyMassIndex 中的 this 就报错了:

"this" 隐式具有类型 "any",因为它没有类型注释。ts(2683)

解决这个问题的方法就是使用箭头函数,因为箭头函数使用其父级的执行上下文:

class Person {
  weight: number;
  height: number; 
  constructor(weight: number, height: number) {
    this.weight = weight;
    this.height = height;
  } 
  getBodyMassIndex() {
    return () => {
      return this.weight / (this.height * this.height);
    };
  }
}

alwaysStrict

此规则指定始终以严格模式检查每个模块,并且在编译之后的 JavaScript 文件中加入"use strict",用来告诉浏览器该 JavaScript 为严格模式。

ECMAScript 严格模式是在 ES5 中引入的,它只是向编译器提示代码应该以严格模式执行,使用严格模式可以使代码更以更安全、高效的方式运行。

strictBindCallApply

此规则可以确保使用具有正确参数的 call()bind()apply() 函数。来看下面的例子:

const logNumber = (x: number) => {
  console.log(`number:${x}`)
}
logNumber.call(undefined, "10"); // 

当启用了严格模式时,getBodyMassIndex 中的 this 就报错了:

类型“string”的参数不能赋给类型“number”的参数。ts(2345)

当遇到这种报错时,只需检查函数调用的参数,并使用正常的方式调用:

logNumber.call(undefined, 10); // number:10

strictNullChecks

此规则使得 null和 undefined 值不能赋值给非这两种类型的值,别的类型的值也不能赋给它们。除了 any 类型,还有个例外就是 undefined 可以赋值给 void 类型。这个选项可以帮助 Uncaught TypeError 错误。来看下面的例子:

interface Book {
    name: string;
    author: string;
  }
const books: Book[] = [ {name: 'Test1', author: 'Max'} ];
const getBookByAuthor = (author: string) => books.find((book) => book.author = author);
const book = getBookByAuthor("John");
console.log(book.name);

当启用了严格模式时,打印 book.name 时就报错了:

对象可能为“未定义”。ts(2532)

如果未开启严格模式,即使 book.name 可能未定义,此代码也会编译。想要修复这个问题,就需要为要编译的代码添加 null 检查:

interface Book {
  name: string;
  author: string;
}
const books: Book[] = [ {name: 'Test1', author: 'Max'} ];
const getBookByAuthor = (author: string) => books.find((book) => book.author = author);
const book = getBookByAuthor("John");
if (book) {
  console.log(book.name);
} else {
  console.log('Book not found');
}

函数中也是一样的,来看下面的例子:

interface Book {
    name: string;
    author: string;
  }
const books: Book[] = [ {name: 'Test1', author: 'Max'} ];
const getBookByAuthor = (author: string) => books.find((book) => book.author = author);
const book = getBookByAuthor("John");
const logBookName = (book: Book) => {
    console.log(book.name);
}
logBookName(book); 

如果启用了严格模式时,调用 logBookName(book); 时就会报错:

类型“Book | undefined”的参数不能赋给类型“Book”的参数。
  不能将类型“undefined”分配给类型“Book”。ts(2345)

这里提供两种解决方案:

  • A:将logBookName 函数参数类型设置为 Book | undefined
  • Bnull 检查条件调用
// A
const logBookName = (book: Book | undefined) => {
    if (book) {
        console.log(book.name);
    }
    else {
        console.log('not book');
    }
}
// B
if (book) {
    logBookName(book);
}

使用该规则时,可以强制开发人员编写具有更好类型描述的代码。

strictPropertyInitialization

此规则将强制在构造函数中初始化所有属性值。来看下面的例子:

class User {
    name: string;
    age: number;
    occupation: string | undefined;   
    constructor(name: string) {
        this.name = name;
    }
}

在上面的代码块中有一个 User 类,constructor() 方法是初始化其实例属性的地方。当实例化一个类对象时,JavaScript 会自动调用 constructor() 方法。Typescript 要求要么初始化定义的属性,要么指定一个 undefined 类型。因此,当编译上面的代码时,将会提示以下错误:

属性“age”没有初始化表达式,且未在构造函数中明确赋值。ts(2564)

对于上面的代码,可以这样改:

// A:指定 undefined 类型
class User {
    name: string;
    age: number | undefined;
    occupation: string | undefined;
    constructor(name: string) {
        this.name = name;
    }
}
// B:初始化定义的属性
class User {
    name: string;
    age: number;
    occupation: string | undefined;
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
}

strictFunctionTypes

此规则会更彻底地检查函数参数。Typescript 参数默认是双向协变的,这意味着它们既可以是协变的,也可以是逆变的。方差是一种深入了解子类型关系的方法。当参数是协方差时,我们可以将特定类型分配给更广泛的类型(例如将子类型分配给超类型)。逆变是相反的:可以将更广泛的类型分配给特定类型(例如将超类型分配给子类型)。

// 非严格模式
interface Animal {
  name: string;
}
interface Dog extends Animal {
  breeds: Array<string>;
}
let getDogName = (dog: Dog) => dog.name;
let getAnimalName = (animal: Animal) => animal.name;
getDogName = getAnimalName;  // Ok
getAnimalName = getDogName;  // Ok

上面的代码运行时并没有提示错误,默认情况下参数是双向协变比较的。超类型 getAnimalName 和子类型 getDogName 的方法可以相互分配。当开启严格模式之后,则 TypeScript 的参数进行逆变比较。

// 严格模式
interface Animal {
  name: string;
}
interface Dog extends Animal {
  breeds: Array<string>;
}
let getDogName = (dog: Dog) => dog.name;
let getAnimalName = (animal: Animal) => animal.name;
getDogName = getAnimalName; // Ok
getAnimalName = getDogName; // Error

当开启严格模式时,最后一行将报以下错误:

不能将类型“(dog: Dog) => string”分配给类型“(animal: Animal) => string”。
  参数“dog”和“animal” 的类型不兼容。
    类型 "Animal" 中缺少属性 "breeds",但类型 "Dog" 中需要该属性。ts(2322)

这里,getAnimalName 是比 getDogName 更广泛的函数。因此,在这种情况下,无法将超类型分配给子类型。但是,可以将子类型分配给超类型。大多数时候,函数参数应该是逆变的,而不是双向协变的。如果开启严格模式,Typescript 将不会将函数参数视为双向协变。

以上就是详解Typescript 严格模式有多严格的详细内容,更多关于Typescript 严格模式的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解Typescript 严格模式有多严格

本文链接: https://www.lsjlt.com/news/178628.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Typescript 严格模式有多严格
    目录正文noImplicitAnynoImplicitThisalwaysStrictstrictBindCallApplystrictNullChecksstrictPropert...
    99+
    2023-01-29
    Typescript 严格模式 Typescript 模式
  • 什么是JavaScript严格模式
    本篇内容介绍了“什么是JavaScript严格模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JavaS...
    99+
    2022-10-19
  • mysql严格模式Strict Mode详细说明
    目录1.开启与关闭Strict Mode方法2.Strict Mode功能说明3.例子:1.not null字段插入null值测试2.自增长字段插入”值测试3.text字段默认值测试总结1.开启与关闭Stri...
    99+
    2022-08-16
    数据库严格模式 mysql非严格模式 mysql严格模式
  • JavaScript严格模式的限制有哪些
    这篇“JavaScript严格模式的限制有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2022-10-19
  • javascript严格模式怎么调用
    这篇“javascript严格模式怎么调用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“j...
    99+
    2022-10-19
  • JavaScript严格模式怎么实现
    本篇内容介绍了“JavaScript严格模式怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、认识...
    99+
    2022-10-19
  • JavaScript严格模式usestrict的介绍
    目录1.概述1.1严格模式是什么1.2严格模式的目的2.开启严格模式2.1全局开启严格模式2.2局部开启严格模式3.严格模式中的变量3.1禁止意外创建变量3.2静默失败转为异常3.3...
    99+
    2022-11-12
  • javascript严格模式的不同点有哪些
    小编给大家分享一下javascript严格模式的不同点有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 不同点:1、禁止使用with语句;2、禁止this关...
    99+
    2022-10-19
  • JS严格模式的示例分析
    这篇文章主要介绍JS严格模式的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!所谓严格模式其实就是一个不会赋值给任何变量的字符串 “use strict”如果在全局作用域下 给...
    99+
    2022-10-19
  • 如何关闭mysql的严格模式
    本篇内容介绍了“如何关闭mysql的严格模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
  • JavaScript严格模式的示例分析
    这篇文章主要介绍了JavaScript严格模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、概述除了正常运行模式,ECMAsc...
    99+
    2022-10-19
  • JavaScript的严格模式怎么开启
    这篇“JavaScript的严格模式怎么开启”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“...
    99+
    2022-10-19
  • JavaScript中怎么使用严格模式
    这篇文章主要介绍“JavaScript中怎么使用严格模式”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript中怎么使用严格模式”文章能帮助大家解决问题...
    99+
    2022-10-19
  • Hive中如何启动严格模式
    这篇文章主要为大家展示了“Hive中如何启动严格模式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Hive中如何启动严格模式”这篇文章吧。启动严格模式如果要查询分区的Hive表,但不提供分区谓词...
    99+
    2023-06-26
  • es6的class是不是严格模式
    今天小编给大家分享一下es6的class是不是严格模式的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。是严格模式。es6类和模...
    99+
    2023-07-04
  • mysql严格模式StrictModel怎么应用
    在MySQL中,严格模式(Strict Mode)是一种配置,它强制执行严格的数据验证规则,以确保数据的完整性和一致性。严格模式包含...
    99+
    2023-09-29
    mysql
  • 如何在 MySQL 中禁用严格模式?
    更改数据的查询中缺失值或不正确值的处理由 MySQL 严格模式控制。其中包含 CREATE TABLE、UPDATE 和 INSERT 语句。当尝试在启用 MySQL 严格模式(默认设置)的情况下处理查询时,无效或丢失的数据可能会导致警告或...
    99+
    2023-10-22
  • vue中的严格模式如何取消
    目录如何取消严格模式解决办法取消严格模式,去除格式警告如何取消严格模式 做项目当中如果遇到以下这种报错: 解决办法 1.vue cli4项目中会有单独的一个eslintrc.js文...
    99+
    2022-11-13
  • 浅析JavaScript中严格模式的使用
    目录认识严格模式严格模式限制认识严格模式 在ECMAScript5标准中,JavaScript提出了严格模式的概念(Strict Mode): 严格模式很好理解,是一种具有限制性的J...
    99+
    2023-05-18
    JavaScript严格模式使用 JavaScript严格模式
  • 如何开启mysql中的严格模式
    很多集成的PHP环境(PHPnow WAMP Appserv等)自带的MySQL貌似都没有开启MySQL的严格模式,何为MySQL的严格模式,简单来说就是MySQL自身对数据进行严格...
    99+
    2022-11-15
    mysql 严格模式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作