TypeScript 2.3 扩充了语言的语法,添加的内容包括支持泛型参数(Generic Parameter)定义默认值,以及支持异步的生成器(Generator)与迭代器(Iterator)。它还提供了新的编译选项,并引入了对语言服务器插件的官方支持,意在改进与现有 JavaScript 代码的集成。
泛型参数默认值类似于函数参数的默认值,它使 TypeScript 的泛型语法更为灵活。举个例子,假定一个泛型函数支持如下三种不同的调用方式:
declare function create(): Container<htmldivelement htmldivelement="">; declare function create<t extends="" htmlelement="">(element: T): Container<t t="">; declare function create<t extends="" htmlelement="" u="">(element: T, children: U[]): Container<t u="">;</t></t></t></t></htmldivelement>
如果使用泛型参数默认值,代码可以更紧致地编写成:
declare function create<t extends="" htmlelement="HTMLDivElement," u="T[]">(element?: T, children?: U): Container<t u="">;</t></t>
对于函数参数默认值应符合的一系列规则,泛型参数默认值同样也应符合。例如,不允许在默认或可选(optinal)参数之后定义强制要求(required)参数、需要确保默认值满足所有类型参数上的约束等。
TypeScript 2.3 不仅能使用编译器标识--downlevelIteration
以 ES3 和 ES5 为生成目标编译生成器和迭代器,而且添加了对异步迭代器和生成器的支持。与非异步迭代一样,异步迭代器也提供了 next
、return
和throw
这三个方法。唯一的不同之处在于,异步迭代器返回的是一个Promise
,而非实际的结果。例如:
interface AsyncIterator<t> { next(value?: any): Promise<iteratorresult><t>>; return?(value?: any): Promise<iteratorresult><t>>; throw?(e?: any): Promise<iteratorresult><t>>; } </t></iteratorresult></t></iteratorresult></t></iteratorresult></t>
异步生成器基于迭代器,是一种可生成部分计算结果的异步函数:
async function* g() { yield 1; await sleep(100); yield* [2, 3]; yield* (async function *() { await sleep(100); yield 4; })(); }
与异步迭代器和生成器密切相关的是,TypeScript 2.3 还引入了for..await..of
语句。该语句的功能类似于非异步迭代器中的for..of
语句。例如:
async function f() { for await (const x of g()) { console.log(x); } }
对异步迭代器和生成器的支持(包括for..await..of
在内)是可选择加入的特性。启用时需要在--lib
编译选项中添加esnext
。
为简化与遗留 JavaScript 代码工作,TypeScript 2.3 新增了一个编译器选项 --checkJs
。具体而言,设置了--checkJs
后,TypeScript 编译器也会对.js 文件报错。这样,开发人员能捕获尽可能多的错误,无需将他们的文件强制转换为.ts 文件。如果.js 文件中添加了// @ts-nocheck
或//@ts-check
注释,那么--checkJs
选项将会跳过对该文件的查错。虽然.js 文件不支持 TypeScript 类型标注,但是支持 JDoc 类型的标注,并将逐步转到支持 TypeScript。
另一个新的编译器选项是--strict
标识,该标识意在简化开发人员对可用的最高层级类型安全的选取。--strict
标识在使用tsc --init
新建的项目中是默认使用的,它等价于:
--strictNullChecks
--noImplicitAny
--noImplicitThis
--alwaysStrict
最后一点,TypeScript 2.3 引入了一个语言服务器插件 API,意在通过加入 Angular 等模板系统及 TSLint 和 GraphQL 等其它类型的内容,加大编辑器对 TypeScript 的支持,实现自动补全等高级特性。
查看英文原文: TypeScript 2.3 Adds Generic Default Arguments, Async Iterators Support, and More
评论