7个好用的TypeScript新功能

1. 可选链

从 v3.7 可用

这是当你尝试访问嵌套数据时的一个痛点,嵌套数据越多,代码就会变得越繁琐。

在下面的例子中,要访问address,你必须遍历data.customer.address,而且data或customer有可能是undefined,所以通常使用&&运算符或类似例子中的技巧遍历检查每个层次的定义。

现在你可以用.?运算符来选择性地对数据访问。通过这种方式,如果存在尚未定义的父级对象,则会在链中的任何位置返回未定义,而不是在运行时崩溃。

// v3.7 以前
if (data && data.customer && data.customer.address) {
   const {address} = data.customer
   const fullAddress = `${address.street}, ${address.city}, ${address.state }${address.zipcode}`
}

// v3.7

// data access
const address = data?.customer?.address
const fullAddress = `${address?.street}, ${address?.city}, ${address?.state } ${address?.zipcode}`

// 也适用于数组
customers?.[0]?.['address']

// 检查方法是否已定义并调用
customer.approve?.()

2. 空值合并

从 v3.7 可用

空值合并运算符是||的替代方法,如果左侧是null或undefined,则它返回右侧的表达式。这和||有什么不同?||本质上是JavaScript中的布尔 OR 运算符,我们尝试利用短路返回第一个非 false 值。这可能会产生意想不到的结果,因为当要求数字 0 或空字符串作为有效输入时,将会被视为false。让我们用一个例子来说明:

// 以前
passPhrase = data.inputString || 'Unknown'  //不会接受 "" (空字符串)
passCode =  data.number || '-1111' // 不会接受 0
rememberMe = data.rememberFlag || true // 将会总是 true!!!

// 现在
passPhrase = data.inputString ?? 'Unknown'  //仅在 inputString 未定义时为 Unknown
passCode =  data.number ?? '-1111' // 0 可以通过
rememberMe = data.rememberFlag ?? true // false 是有效值

通过这种方式可以明确地区分undefined与false的值。

3. 递归类型别名

从 v3.7 可用

现实世界中的很多数据类型都是递归的。例如,当你尝试处理分层数据时,会发现存在相同类型数据的重复模式。jsON 是一个很好的例子,它本质上是一个哈希映射,而哈希映射本身可以包含另一个映射或映射数组。

在 v3.6 之前,如果必须定义一个简单的jsON 类型,则必须像下面这样:

interface JSONObject { [x: string]: JSONValue; }
interface JSONArray extends Array<JSONValue> { }
type JSONValue = string | number | boolean | JSONObject | JSONArray

如果你尝试将第 1 行和第 2 行的类型在像第 3 那样内联,则可能会出现以下错误:Type alias JSONValue circularly references itself。

在 v3.7 中已经有效解决了这个问题,可以像下面这样简单地进行编码:

type JSONValue = string | number | boolean | { [x: string]: JSONValue } | Array<JSONValue>

4. 断言签名

从 v3.7 可用

你应该知道 TypeScript 具有类型保护,可以很好地与JavaScript中的typeof和instanceOf运算符一起使用。这有助于为函数的参数添加前提条件,以便将其限制为特定的类型。

让我们写一段把上面提到的这些东西都用到的代码,通过添加类型保护来确保给定的输入是日期,并从中提取年份:

function isDate(input: unknown) : asserts input is Date {
  if (input instanceof Date)
    return;
  else
    throw new Error('Input must be a Date!');
} 

function getYear(input: unknown) : number {
  isDate(input);
  return input.getFullYear()  // TypeScripts knows that input is Date
} 

console.log(getYear(new Date('2019-01-01')));
console.log(getYear('2019-01-01')); 

上面的代码看起来很不错,但 TypeScript 仍然会提示getFullYear 在未知类型上不可用。

从 v3.7 开始,TypeScript 添加了一个名为asserts的新关键字,它能够使编译器从断言起就知道正确的类型。对于断言函数,应该添加asserts <param> as <type>而不是返回类型。

这样,如果断言通过,TypeScript 将假定参数是前面定义的类型。修改后的代码如下所示:

function isDate(input: unknown) : asserts input is Date {
  if (input instanceof Date)
    return;
  else
    throw new Error('Input must be a Date!');
} 

function getYear(input: unknown) : number {
  isDate(input);
  return input.getFullYear()  // TypeScripts knows that input is Date
} 

console.log(getYear(new Date('2019-01-01')));
console.log(getYear('2019-01-01')); 

5. 为 Promise 提供更好的反馈

从 3.6 起改进

在代码中直接使用 Promise 而忘记使用await或then是常见的错误,如下所示:

interface Customer {
    name: string
    phone: string
}

declare function getCustomerData(id: string): Promise<Customer>;
declare function payCustomer(customer: Customer): void;

async function f() {
    const customer = getCustomerData('c1')
    payCustomer(customer)
}

以前的 TypeScript 完全不了解 Promise,并显示一条与其无关的错误消息,如下所示:

从 v3. 6 开始,编译器变得非常聪明,可以建议你应该兑现 Promise。注意最新的编译器是如何处理相同的错误的:

下面简单讨论一下不需要深入了解细节的一些功能:

6. Unicode 标识符

从 v3.6 可用

const hello = "world"

上面的代码可能不能够在早期版本的 TypeScript 上编译,但是现在你可以从更广泛的 unicode 集中定义标识符。

7. 增量编译

从 v3.4 起可用

如果你在大型项目上使用 TypeScript,则编译器可能需要很长时间才能响应你对该代项目中文件所做的更改。现在有了新的--incremental标志,你可以将其添加到tsc(typescript 编译器)命令行中,这个命令行将会递增地编译修改过的文件。

TypeScript 通过把自从上次编译以来的项目信息保存在代码库内的本地缓存目录中来实现这一目的。在react代码库上,一定要记住在Webpack或Parcel进行正确的配置,这样才能在构建管道中利用增量编译。

以上就是7个好用的TypeScript新功能的详细内容,更多关于TypeScript新功能的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解TypeScript中的类型保护

    概述 在 TypeScript 中使用联合类型时,往往会碰到这种尴尬的情况: interface Bird { // 独有方法 fly(); // 共有方法 layEggs(); } interface Fish { // 独有方法 swim(); // 共有方法 layEggs(); } function getSmallPet(): Fish | Bird { // ... } let pet = getSmallPet(); pet.layEggs(); // 正常 pet.swim();

  • TypeScript泛型参数默认类型和新的strict编译选项

    概述 TypeScript 2.3 增加了对声明泛型参数默认类型的支持,允许为泛型类型中的类型参数指定默认类型. 接下来看看如何通过泛型参数默认将以下react组件从js(和jsX)迁移到 TypeScript (和TSX): class Greeting extends react.Component { render() { return <span>Hello, {this.props.name}!</span>; } } 为组件类创建类型定义 咱们先从为Component类

  • 一篇文章带你使用Typescript封装一个Vue组件(简单易懂)

    一.搭建项目以及初始化配置 vue create ts_vue_btn 这里使用了vue CLI3自定义选择的服务,我选择了ts.stylus等工具.然后创建完项目之后,进入项目.使用快捷命令code .进入Vs code编辑器(如果没有code .,需要将编辑器的bin文件目录地址放到环境变量的path中).然后,我进入编辑器之后,进入设置工作区,随便设置一个参数,这里比如推荐设置字号,点下.这里是为了生成.vscode文件夹,里面有个json文件. 我们在开发项目的时候,项目文件夹内的文件很

  • 前端深入理解Typescript泛型概念

    首先介绍一下泛性的概念 泛型程序设计(generic programming)是程序设计语言的一种风格或范式.泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型. 泛型是指在定义函数,接口或者类的时候,不预先定义好具体的类型,而在使用的时候在指定类型的一种特性. 先举一个简单的例子 假设我们定义一个函数,它可以接收一个number类型做为参数,并且返回一个number类型. function genericDemo(data: number):

  • typescript配置alias的详细步骤

    1 安装依赖 npm install --save-dev babel-plugin-module-resolver # yarn add babel-plugin-module-resolver --dev 根目录新增.babelrc文件 参考以下内容按您项目中的需要去修改 { "presets": ["next/babel"], "plugins": [ [ "module-resolver", { "alias

  • 你不知道的 TypeScript 高级类型(小结)

    前言 对于有 JavaScript 基础的同学来说,入门 TypeScript 其实很容易,只需要简单掌握其基础的类型系统就可以逐步将 JS 应用过渡到 TS 应用. // js const double = (num) => 2 * num // ts const double = (num: number): number => 2 * num 然而,当应用越来越复杂,我们很容易把一些变量设置为 any 类型,TypeScript 写着写着也就成了 AnyScript.为了让大家能更加深入

  • 如何通俗的解释TypeScript 泛型

    概述 在 TypeScript 中我们会使用泛型来对函数的相关类型进行约束.这里的函数,同时包含 class 的构造函数,因此,一个类的声明部分,也可以使用泛型.那么,究竟什么是泛型?如果通俗的理解泛型呢? 什么是泛型 泛型(Generics)是指在定义函数.接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性. 通俗的解释,泛型是类型系统中的"参数",主要作用是为了类型的重用.从上面定义可以看出,它只会用在函数.接口和类中.它和js程序中的函数参数是两个层面的事物

  • TypeScript 运行时类型检查补充工具

    TypeScript是静态类型系统,在编译时做类型检查.一般而言,如果项目所用到的所有库.模块都是基于ts的,那么静态类型已经可以避免大部分编程层面的类型问题.不过,在一些场景下来,单纯静态类型是无法解决问题的,部分数据是动态传入到系统中的,主要包含场景如下: 第三方数据源(接口API.本地持久化存储.postMessage等) 第三方调用者传参 全局状态变更 当然,还有其他可能,总之,单纯靠静态类型检查,无法解决运行时类型问题.因此,我写了tyshemo这个工具.它可以帮助我们完成运行时的类型

  • TypeScript 引用资源文件后提示找不到的异常处理技巧

    在tsx中引用图片,在文件文本编辑器中提示错误引用: typescript无法识别非代码文件(js是可以的).如果需要在ts中识别此文件资源,可以先声明文件类型. 新建一个ts文件,比如global.d.ts(.d.ts是typescript declaration file的简称),并放在主要代码文件夹下. 在ts文件中,添加各种文件类型的声明,比如: declare module '*.svg' { interface Svg { content: string; id: string; v

  • 7个好用的TypeScript新功能

    1. 可选链 从 v3.7 可用 这是当你尝试访问嵌套数据时的一个痛点,嵌套数据越多,代码就会变得越繁琐. 在下面的例子中,要访问address,你必须遍历data.customer.address,而且data或customer有可能是undefined,所以通常使用&&运算符或类似例子中的技巧遍历检查每个层次的定义. 现在你可以用.?运算符来选择性地对数据访问.通过这种方式,如果存在尚未定义的父级对象,则会在链中的任何位置返回未定义,而不是在运行时崩溃. // v3.7 以前 if (

  • JavaScript 2018 中即将迎来的新功能

    JavaScript 2018 中即将迎来的新功能:异步生成器及更好的正则表达式 2018 年 6 月发布的最新年度 ECMAScript 更新,尽管在常见功能的积压上仍然远远小于 ECMAScript 6,但依然是迄今为止最大的年度版本. 身为 ECMAScript 编辑及微软在 ECMA TC39 委员会代表的 Brian Terlson 告诉 The New Stack:这个版本中两个最大的开发者功能是异步生成器和一些期待已久的正则表达式改进,以及 rest/spread 属性. "异步生

  • WebStorm 发布2021.3重大更新新功能介绍

    ​2021年度最后一次重大更新WebStorm 2021.3来了!此更新充满了期待已久的增强功能,包括对远程开发的支持.改进的 HTML 完成.重新设计的 Deno 集成等.需要下载WebStorm 2021.3可以登陆慧都官网免费下载 我们下载:https://www.jb51.net/softs/598714.html ​ 新功能和改进分为以下几类: JavaScript 和 TypeScript:改进了 monorepos 的使用.更快的 JavaScript 文件索引时间.下载远程 ES

  • TypeScript新语法之infer extends示例详解

    目录 正文 模式匹配 提取枚举的值的类型 总结 正文 我们知道,TypeScript 支持 infer 来提取类型的一部分,通过模式匹配的方式. 模式匹配 比如元组类型提取最后一个元素的类型: type Last<Arr extends unknown[]> = Arr extends [...infer rest,infer Ele] ? Ele : never; 比如函数提取返回值类型: type GetReturnType<Func extends Function> = F

  • 揭秘PowerShell 5.0新特性和新功能

    Windows PowerShell 5.0中包含了大量的新特性和新功能,提升了整体的用户体验.虽然其中一些功能只能供硬核PowerShell开发人员使用,但其他新功能和特性具有广泛的适用性. 例如其中一个新功能是远程文件编辑.管理员暂时可以通过PowerShell建立与另一个Windows服务器的远程会话.新的远程文件编辑功能在此基础之上进行构建,从而能够建立一个远程会话,然后在远程计算机上编辑文件. 建立远程会话的方法通常相同.你可以使用Enter-PSSession命令,附上–Comput

  • Dreamweaver基础教程 (一)之新功能简介

    注:Dreamweaver8和Dreamweaver2004学习基础,一样,所以看这个一样学Dreamweaver8Macromedia Dreamweaver MX 2004 (简称DW MX 2004),是Macromedia 最新开发的的HTML编辑器,用于对Web站点.Web页和 Web应用程序进行设计.编码和开发. DW MX 2004 包含有一个崭新.简洁.高效的界面,且性能也得到了改进.此外,还包含了众多新增的功能,改善了软件的易用性并使您无论处于设计环境还是编码环境都可以方便地生

  • Windows Vista 安装全过程以及新功能截图

    在安装之前我们先来了解一下vista的配置要求: 处理器(CPU) 目前所有中端以上的Intel或AMD处理器都可以满足Windows Vista的基本需求,低端处理器也可以运行 Vista,但是可能无法达到最佳效果,而且显然无法在高端游戏以及视频编辑上胜任. AMD和Intel都已经推出了各自的双核心处理器,毋庸置疑的是,他们都将成为Windows Vista的出色选择在64位方面,目前的AMD.Intel 64位处理器是个不错的选择,而且根据我们的预测,当Windows Vista正式上市时

  • Spring 4.0新功能:@Conditional注解详细介绍

    前言 最近在学习spring,抽空会将学习的知识总结下面,本文我们会接触spring 4的新功能:@Conditional注解.在之前的spring版本中,你处理conditions只有以下两个方法: 在3.1版本之前,你需要使用spring expression language 在3.1版本发布时,profiles被引入来处理conditions. 让我们分别看看以上两者,在来理解spring 4带来的@Conditional注解. Spring Expression Language(SP

  • ES6正则表达式的一些新功能总结

    本文主要总结了ES6正则表达式的一些新功能,分享出来供大家参考学习,下面来看看详细的介绍: 一.构造函数实例化参数的变化 大家都知道,在ES5中,new RegExp(参数1,参数2),参数1若是指定了正则修饰符,则参数2就不应该出现,否则将会报错,在ES6中,第二个参数的正则修饰符会覆盖掉原有的修饰符: <script> //在ES5中,下面的正则自带修饰符ig,则第二个参数不能出现 var reg = new RegExp(/asd/ig); //在ES6中,如下: var reg = n

  • 关于visual studio 2012 update 2中的新功能介绍

    对于vs2012 update2中的新功能,确实很多.挑一个对于调试和写代码很有帮助的功能吧.codemap/代码图.该功能能够非常清楚和直观的让你理清代码的调用关系和引用关系. 传统的调试,应该都是设置各种断点,各种F11.现在有可视化的代码图方便你的调试. 并且可以在代码调试的时候去进行载入. 最重要的是可以在代码图中根据调试情况加入标签与颜色标记,方便自己调试与团队协作. 怎么样,这个新功能大家都知道吗?如果不知道建议赶紧用用,轻松你调试. 个人强烈推荐

随机推荐