TypeScript 3.6 发布,微软脚本编程语言

栏目: 软件资讯 · 发布时间: 5年前

内容简介:TypeScript 3.6 已经发布了,更新内容如下: 使用更严格的生成器(Stricter Generators) TypeScript 3.6 引入了对迭代器和生成器函数(generator functions)的更严格检查。在早期版本中,生成器的使用者无法区分...

TypeScript 3.6 已经发布了,更新内容如下:

使用更严格的生成器(Stricter Generators)

TypeScript 3.6 引入了对迭代器和生成器函数(generator functions)的更严格检查。在早期版本中,生成器的使用者无法区分一个值是来自 yield 操作或是从生成器返回。

TypeScript 3.6 发布,微软脚本编程语言

另外,生成器仅仅假设 yield 类型是任意的:

TypeScript 3.6 发布,微软脚本编程语言

以第一段代码为例,在 TypeScript 3.6 中,检查器会知道 curr.value 的正确类型应为 string,并在最后一个示例中纠正对 next() 的错误调用。这要归功于因在IteratorIteratorResult类型声明中进行的一些更改而引入部分新的类型参数,以及 TypeScript 用于代表称为Generator类型的生成器。

该版本中 Iterator 类型允许用户说明 yield 类型、返回的类型和 next 可以接受的类型。

TypeScript 3.6 发布,微软脚本编程语言

在此基础上,新类型 Generator 是一个 Iterator,它同时存在 return 和 throw 方法,并且是可迭代的。

TypeScript 3.6 发布,微软脚本编程语言

为了区分返回的值和生成的值,TypeScript 3.6 将 IteratorResult 类型转换为联合类型:

type IteratorResult<T, TReturn = any> = IteratorYieldResult<T> | IteratorReturnResult<TReturn>;

interface IteratorYieldResult<TYield> {
    done?: false;
    value: TYield;
}

interface IteratorReturnResult<TReturn> {
    done: true;
    value: TReturn;
}

简而言之,这意味着在直接处理迭代器时,将能够适当地缩小迭代器的值。

为了正确表示可以从调用 next( ) 传入生成器的类型,TypeScript 3.6 还可以推断生成器函数主体内的某些 yield 用途。

TypeScript 3.6 发布,微软脚本编程语言

如果你希望显式,还可以使用显式返回类型从 yield 表达式强制执行返回、yield 和计算的值的类型。如下,只能用布尔值调用 next( ),并且取决于 done 的值,value 要么是 string,要么是 number。

/**
 * - yields numbers
 * - returns strings
 * - can be passed in booleans
 */
function* counter(): Generator<number, string, boolean> {
    let i = 0;
    while (true) {
        if (yield i++) {
            break;
        }
    }
    return "done!";
}

var iter = counter();
var curr = iter.next()
while (!curr.done) {
    console.log(curr.value);
    curr = iter.next(curr.value === 5)
}
console.log(curr.value.toUpperCase());

// prints:
//
// 0
// 1
// 2
// 3
// 4
// 5
// DONE!

更精确的数组扩展

在默认情况下,TypeScript 使用一个更简单的发射,它只支持数组类型,并支持使用 --downlevelIteration 标志在其他类型上进行迭代。在此标志下,发出的代码更准确,但要大得多。但是,在某些边缘情况下,受支持的数组还是存在一些差异,如下:

[...Array(5)]

等效于以下数组:

[undefined, undefined, undefined, undefined, undefined]

但是,TypeScript 将原始代码转换为以下代码:

Array(5).slice();

这是不一样的,Array(5) 生成长度为 5 的数组,但没有属性:

TypeScript 3.6 发布,微软脚本编程语言

当 TypeScript 调用 Slice( ) 时,它还会创建一个数组,其中包含尚未设置的索引。

3.6 版本引入了一个新的 __spreadArrays 助手,用于精确地模拟 ECMAScript 2015 中在 --downlevelIteration 之外中发生的情况。__SpreadArray 也可在 tslib 中使用。

Improved UX Around Promises

Promise 是当前处理异步数据的最常见方法之一,不幸的是,使用Promise面向对象的 API 通常会让使用者感到困惑。因此针对Promise被错误处理的情况,TypeScript 3.6 引入了一些改进。

例如,在将其传递给另一个函数之前,Promise忘记.then()或者await内容通常是很常见的。TypeScript 的错误消息现在是专用的,并告知使用者他们可能应该考虑使用await关键字。

TypeScript 3.6 发布,微软脚本编程语言

另外还提供快速修复:

TypeScript 3.6 发布,微软脚本编程语言

更好的 Unicode 支持标识符

当发射到 ES 2015或其他时,3.6 版本包含更好地支持标识符中的 Unicode 字符:

TypeScript 3.6 发布,微软脚本编程语言

在 SystemJS 中支持 import.meta

3.6 版本支持在将 module 目标设置为 system 时,将 import.meta 转换为 context.meta。

TypeScript 3.6 发布,微软脚本编程语言

get and set Accessors Are Allowed in Ambient Contexts

在早期版本的 TypeScript 中,并不允许在环境上下文中 set 和 get 访问器,其基本原理是,就写入和读取这些属性而言,访问器与属性并没有区别;然而,由于 ECMAScript 的类字段提案可能与现有版本的 TypeScript 中的行为不同,则需要一种方法来沟通这种不同的行为,以便在子类中提供适当的错误。

因此 TypeScript 3.6 中,用户可以在环境上下文中编写 getter 和 setter。

TypeScript 3.6 发布,微软脚本编程语言

环境类和函数可以合并

在以前版本中,在任何情况下合并类和函数都是有错的。此版本中,环境类和函数(带有 declare 修饰符的类/函数,或 .d.ts 文件中的类/函数)可以合并。如下内容:

TypeScript 3.6 发布,微软脚本编程语言

而不需要使用:

TypeScript 3.6 发布,微软脚本编程语言

它的一个优点是可以轻松地表达可调用的构造函数模式,同时允许名称空间与这些声明合并(因为 var 声明不能与名称空间合并)。

APIs to Support --build and --incremental

TypeScript 3.6 增加了两组用于操作项目引用和增量式程序构建的 API。

对于 --incremental,用户可以使用 createIncrementalProgram 和 createIncrementalCompilerHost API。用户还可以使用新的 readBuilderProgram 函数从该 API 生成的 .tsbuildinfo 文件中重新补充旧的程序实例,该函数仅用于创建新程序(即不能修改返回的实例,它仅用于其他 Create*Program 函数中的oldProgram 参数)。

New TypeScript Playground

此版本中,新的 TypeScript playground 支持许多新的选择,包括:

  • target 选项(允许用户从 ES5 切换到 ES3、es2015、esnext 等)
  • 所有标记(包括 strict)
  • 对普通 JavaScript 文件的支持(使用 allowJS 和 CheckJS)

当共享链接到 playground 示例时,这些选项也会持续存在,这样用户就可以更可靠地共享示例。

Semicolon-Aware Code Edits

像 Visual Studio 和 Visual Studio Code 这样的编辑器可以自动应用快速修复、重构和其他转换,比如从其他模块自动导入值。这些转换由 TypeScript 驱动,老版本的 TypeScript 无条件地在每条语句的末尾添加分号;不幸的是,这不符合许多用户的样式指南,许多用户对编辑器插入分号不满意。

在此版本中,在应用这类编辑时,TypeScript 可以检测文件是否使用分号。如果你的文件是缺少分号,TypeScript 则不会添加分号。

Smarter Auto-Imports

JavaScript 有许多不同的模块语法或约定:ECMAScript 标准、Node 支持的模块语法或约定(CommonJS)、AMD、System.js 等等。在大多数情况下,TypeScript 将默认使用 ECMAScript 模块语法自动导入,在具有不同编译器设置的某些 TypeScript 项目中,或者在具有普通 JavaScript 和 Require 调用的 Node 项目中,这通常是不合适的。

在 3.6 版本中,在决定如何自动导入其他模块之前,它会查看现有的导入。

Breaking Changes

类成员 constructor 现在是构造函数

根据 ECMAScript 规范,名为 constructor 的方法的类声明现在是构造函数,无论它们是使用标识符名称声明,还是使用字符串名称声明。

TypeScript 3.6 发布,微软脚本编程语言

TypeScript 3.6 发布,微软脚本编程语言

DOM 更新

在 lib.dom.d.ts 中已经删除或更改了许多声明,这包括(但不限于)以下内容:

  • 全局 window 不再定义为类型 Window,而是定义为类型 Window & type of globalThis。在某些情况下,将其类型称为 typeof window
  • GlobalFetch 移除了,而是使用 WindowOrWorkerGlobalScope
  • Navigator 上的某些非标准属性已经消失
  • experimental-webgl 移除了,而是使用 webgl 和 webgl2

JSDoc 注解不再合并

在 JavaScript 文件中,TypeScript 只会在紧接 JSDoc 注解之前确定声明的类型。

TypeScript 3.6 发布,微软脚本编程语言

关键字不能包含转义序列

以前,关键字被允许包含转义序列。3.6 版本不再允许:

TypeScript 3.6 发布,微软脚本编程语言

关于 TypeScript 3.6 更多信息,请见 TypeScript 网站。使用 npm 命令获取:

npm install -g typescript

还可以通过以下方式获得编辑器支持:

发布说明:

https://devblogs.microsoft.com/typescript/announcing-typescript-3-6/


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Modeling the Internet and the Web

Modeling the Internet and the Web

Pierre Baldi、Paolo Frasconi、Padhraic Smyth / Wiley / 2003-7-7 / USD 115.00

Modeling the Internet and the Web covers the most important aspects of modeling the Web using a modern mathematical and probabilistic treatment. It focuses on the information and application layers, a......一起来看看 《Modeling the Internet and the Web》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具