BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

TypeScript 1.7发布:支持async/await、模块化、多态this和求幂语法

| 作者 孙镜涛 关注 2 他的粉丝 发布于 2015年12月5日. 估计阅读时间: 7 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

伴随着Visual Studio 2015 Update 1的发布,TypeScript 1.7也发布了,新版本默认支持ES6 (ECMAScript 6)的async/await以及模块化特性,支持多态“this”类型,支持ECMAScript 2016提出的求幂语法。详细的变更列表,可以查看GitHub上的路线图

和之前一样,用户可以通过Visual Studio 2015 Update 1Visual Studio 2013NPM或者直接通过源码来使用TypeScript 1.7 。

Async/Await

在1.7版本中,用户能够在启用了ES6 Generator支持的目标上(例如Node.js V4及更高版本)使用async函数。而使用了async前缀的函数是异步函数,开发者可以在程序中使用await关键字来停止异步函数的执行,直到约定被满足为止。示例如下:

重要通知:接下来InfoQ将会选择性地将部分优秀内容首发在微信公众号中,欢迎关注InfoQ微信公众号第一时间阅读精品内容。

"use strict";
// printDelayed is a 'Promise'
async function printDelayed(elements: string[]) {
    for (const element of elements) {
        await delay(200);
        console.log(element);
    }
}

async function delay(milliseconds: number) {
    return new Promise(resolve => {
        setTimeout(resolve, milliseconds);
    });
}

printDelayed(["Hello", "beautiful", "asynchronous", "world"]).then(() => {
    console.log();
    console.log("Printed every element!");
});

Microsoft正在努力将TypeScript中的async/await支持扩展到其他领域,包括浏览器这一并不支持ES6 Generator 的领域。如果想要了解async/await的实现细节以及使用方法,可以查看博文《什么是Async/Await》

多态this类型

在经过了大量的社区讨论和反馈之后,TypeScript 1.7增加了一个新的多态this类型。开发者能够在类和接口中使用this类型,以表示某些类型是包含类型的子类型(而不是包含类型本身)。该特性能够让层级流式API这样的模式更加容易表达。

interface Model {
    setupBase(): this;
}

interface AdvancedModel extends Model {
    setupAdvanced(): this;
}

declare function createModel(): AdvancedModel;
newModel = newModel.setupBase().setupAdvanced(); // fluent style works

如果想深入了解该关键字,可以查看TypeScript Wiki

作为支持该特性的一部分,TypeScript 1.7修改了this的类型推理逻辑。在一个类中,值this的类型将会被推断为this类型,用后续的原始类型值赋值会失败。作为一种替代方法,用户可以为this添加一个类型注解。使用替代方法的代码示例以及其他可能的重大变化可以查看GitHub。

ES6模块

TypeScript 1.7将ES6添加到了选项列表中,开发者能够使用--module标记,当目标为ES6的时候指定模块化输出。这一特性为用户提供了更多的扩展性,让用户能够针对具体的运行时精确地指定特性。例如,现在能够以Node.js v4为目标,它并不支持ES6模块,但是支持一些其他的ES6特性。

//tsconfig.json targeting node.js v4 and beyond
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6"
    }
}

ES7求幂运算

最后是一个小语法糖。ECMAScript委员会最近将求幂运算符提议移动到了第三阶段。对于Microsoft来说这表示在TypeScript中采纳该特性的时机已经成熟,于是在TypeScript 1.7中添加了对它的支持。

let squared = 2 ** 2;  // same as: 2 * 2
let cubed = 2 ** 3;  // same as: 2 * 2 * 2
let num = 2;
num **= 2; // same as: num = num * num;
Say goodbye to Math.pow()!

下一步计划

虽然Microsoft非常愉快地宣布了他们在该版本中做的所有提升,但是Microsoft也一如既往地关注社区的反馈。如果你对TypeScript的未来非常关注,那么Microsoft非常鼓励你检出已有的问题给他们提出pull request,或者在Gitter上与TypeScript团队交流。


感谢徐川对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入InfoQ读者交流群InfoQ好读者(已满),InfoQ读者交流群(#2)InfoQ好读者)。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

async语法确实很简洁 by Chow Andy

async语法确实很简洁

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT