相关链接

TypeScript 2.0 正式版已经发布了:〔译〕TypeScript 2.0 正式版发布
不过可能大家更关心的是 〔译〕TypeScript 2.0 的新特性


原文:Announcing TypeScript 2.0 RC
August 30, 2016 by Daniel Rosenwasser

TypeScript 2.0 候选发行版(RC)出来了,离 TypeScript 2.0 最终发布也就不远了,赞!如果你还没开始使用 TypeScript,可以先看看网站上的教程。

要使用 RC 版本,可以下载 TypeScript 2.0 RC for Visual Studio 2015(需要 VS2015 Update 3);也可以通过 NuGet 下载,或者像下面这样使用 npm:

npm install -g typescript@rc

Visual Studio Code 用户想使用 RC 版本请参考这里。

这个 RC 版本让大家看到 2.0 正式版的样子,我们通过这个版本广泛收集用户反馈,将 2.0 打造得更加稳定可靠。总的来说,一般情况下 RC 版本已经足够稳定了,并且我们不希望再往上加新的特性。

不过,自 2.0 Beta 发布以来,已经加了不少东西,所以下面可能会有你尚未听说的新特性。

推断类型(Tagged Unions)

译者注

对于 Tagged Unions 的翻译,我查了很多资料,在 wiki 上找到如下描述:a tagged union, also called a variant, variant record, discriminated union, disjoint union, or sum type。其中 Variant 这个说法在 VB 中十分常用。在参考了 C# 对 var 关键字的翻译之后,我决定将其翻译为“推断类型”。

推断类型是一种数据结构,很像联合(C/C++程序员一定知道这个结构)。它有一个字段(或称为属性)用于识别当前结构的确切类型。(参考 What is a tagged union)

推断类型使 JavaScript 在某些方向更像 F#、Swift 等语言。为此,JavaScript 程序员们一定会非常高兴。这个特性也叫 可识别联合互斥联合代理类型。不过特性本身显然比名称更有意思。

假设有两个类型:CircleSquare,然后定义它们的联合类型,命名为 Shape

interface Circle {kind: "circle";radius: number;
}interface Square {kind: "square";sideLength: number;
}type Shape = Circle | Square;

注意 CircleSquare 都有一个叫 kind 的字段,保存的字符串常数,表示类型。也就是说 Circlekind 总是 "circle"。每个类型都有一个共同的字段,但通过不同的值作为 标记 区分开来。

在 TypeScript 1.8 中,如果写一个获取面积的函数,需要判断 Shape 的每种类型。

function getArea(shape: Shape) {switch (shape.kind) {case "circle":// 从 'Shape' 转换为 'Circle'let c = shape as Circle;return Math.PI * c.radius ** 2;case "square":// 从 'Shape' 转换为 'Square'let sq = shape as Square;return sq.sideLength ** 2;}
}

注意到我们为每种图形都使用了一个中间变量来使代码看起来简洁。

在 2.0 中就不再需要中间变量了。语言懂得如何通过 kind 来辨别类型,所以你可以少写点代码

function getArea(shape: Shape) {switch (shape.kind) {case "circle":// 这里 'shape' 是 'Circle'return Math.PI * shape.radius ** 2;case "square":// 这里 'shape' 是 'Square'return shape.sideLength ** 2;}
}

上面的代码完全正确,TypeScript 能通过流程控制分析每个分支上的正确类型。可以使用 --noImplicitReturns 和即将可用的 --strictNullChecks 特性保证这些检查更彻底。

推断类型让 JavaScript 这种形式下的代码更简洁也更安全。例如,像 Redux 这样的库经常使用这种形式的来处理 action。每个独立的

更多字面类型

1.8 带来的字符串字面类型非常有用,就像上面看到的那样,可以用它来处理推断类型。

除了字符串,我们还想提供更多的类型。在 2.0 中,每个独特的布尔、数值或枚举成员都可以拥有自己的类型!

type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
let nums: Digit[] = [1, 2, 4, 8];// 错误! '16' 不是 'Digit'!
nums.push(16);

这样在使用推断类型时,我们可以快速而地处理一些事情而毫无违和感。

interface Success<T> {success: true;value: T;
}interface Failure {success: false;reason: string;
}type Result<T> = Success<T> | Failure;

这里的 Result<T> 类型可能表示失败。如果表示成功,它有一个值,如果表示失败,它包含表示失败原因的 reson 字段。value 字段仅在 successtrue 的时候有效。

declare function tryGetNumUsers(): Result<number>;let result = tryGetNumUsers();
if (result.success === true) {// 'result' 是 'Success<number>' 类型的console.log(`Server reported ${result.value} users`);
}
else {// 'result'是 'Failure' 类型的console.error("Error fetching number of users!", result.reason);
}

你可能已经注意到了,枚举值也可以拥有它们自己的类型!

enum ActionType { Append, Erase }interface AppendAction { type: ActionType.Append;text: string;
}interface EraseAction {type: ActionType.Erase;numChars: number;
}function updateText(currentText: string, action: AppendAction | EraseAction) {if (action.type === ActionType.Append) {// 'action' has type 'AppendAction'return currentText + action.text;}else {// 'action' has type 'EraseAction'return currentText.slice(0, -action.numChars);}
}

Globs语法、包含和排除

译者注

Globs 直译是“团块”的意思,不过这显然不如 Globs 本身意思明确。所以这里我没有翻译这个词。关于 Globs,可以参考 node-blog 在 README.md 中的说明。

首次向大家介绍 tsconfig.json 文件的时候,手工列出所有文件实在痛苦。TypeScript 1.6 引入了 excludes 配置来缓解这个问题;然而,这显然不够。痛苦在于,写完了每条文件路径,仍然会有问题发生,结果是因为忘了排除新文件。

TypeScript 2.0 终于开始支持 Globs 语法。Globs 允许我们在路径中使用通配符,这样一来,写路径再也不是件乏味的事了。

includeexclude 配置中都可以使用 Globs 语法。来看一个 tsconfig.json 的示例:

{"include": ["./src/**/*.ts"],"exclude": ["./src/tests/**"]
}

TypeScript globs 语法支持如下通配符:

  • * 匹配 0 个或多个字符,分隔符(比如 /\)除外
  • ? 精确匹配 1 个字符,分隔符除外
  • **/ 匹配任意层子目录

接下来的事

之前提到,TypeScript 2.0 很快就发布了,但是使用 RC 版本带来的 2.0 的新特性会为社区发展带来巨大的作用。

如果发现任何问题,可以 通过Github 反馈给我们。我们非常愿意听到你尝试之后给我们的反馈。祝愉快!

〔译〕TypeScript 2.0 候选版发布相关推荐

  1. 和平之翼代码生成器 SMEU 版 4.0.0 RC 宝船候选版发布

    和平之翼代码生成器SMEU版4.0.0 RC宝船候选版发布  项目地址: https://gitee.com/jerryshensjf/PeaceWingSMEU 最近进展  已释出和平之翼代码生成器 ...

  2. Wonder 1.0 正式版发布,WebGL 3D引擎和编辑器

    介绍 Wonder 1.0正式版发布了.免费.开源,不用注册,直接打开在线编辑器即可使用. Wonder 是 web 端 3D 开发的解决方案,包括引擎.编辑器,致力于打造开放.分享.互助的生态.Wo ...

  3. vue 3.0 正式版_Vuejs 3 Release:One Piece. Vuejs 3.0 正式版发布!代号:海贼王

    Vuejs 3.0 在北京时间2020年9月19日凌晨,终于发布了 3.0 版本,代号:One Piece.此次vue3.0 为用户提供了全新的 composition-api 以及更小的包大小,和更 ...

  4. StartOS 5.0 正式版发布

    StartOS 5.0正式版发布了. StartOS -- 是由东莞瓦力网络科技有限公司发行的开源操作系统,符合国人的使用习惯,预装常用的精品软件,操作系统具有运行速度快,安全稳定,界面美观,操作简洁 ...

  5. gecco 1.1.0稳定版发布,易用的轻量化爬虫

    gecco 1.1.0稳定版发布了. 1.1.0版本主要做了如下修改: 1.优化代理设置,运行时计算代理下载成功率,自动发现无效代理,支持运行时添加代理 2.HttpClientDownloader支 ...

  6. 服务器安全股v4.0正式版发布 防火墙效能更强

    2019独角兽企业重金招聘Python工程师标准>>> 6月24日,服务器安全狗v4.0正式版发布. 超强驱动,全线优化 服务器安全狗全方位兼容驱动V2.0震撼上线,由内而外全面提高 ...

  7. Xcode 7.0正式版发布了

    Xcode 7.0正式版发布了 下载地址:链接: http://pan.baidu.com/s/1FNkPS 密码: ee42 本文由大学霸整理,转载请注明出处,尊重IT人!

  8. 重磅消息:Redis 6.0.0 稳定版发布

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://www.sohu.com/a/ ...

  9. python3最新稳定版本-Python 3.9.0 稳定版发布

    新酷产品第一时间免费试玩,还有众多优质达人分享独到生活经验,快来新浪众测,体验各领域最前沿.最有趣.最好玩的产品吧~!下载客户端还能获得专享福利哦! 原标题:Python 3.9.0 稳定版发布 IT ...

最新文章

  1. [译]Vulkan教程(05)Instance
  2. mysql体系结构:
  3. tv英语域名注册_企业邮箱十万个为什么——域名篇
  4. 【Openstack】【Nova】开发者入门,开发工作流
  5. 黄章爆料魅族16s/16s Plus更多信息 无线充电已做到24W
  6. SwiftUI 打开高德地图
  7. astar插件下载 就行_送给你们一个ps插件,5秒抠图神器,这个肯定是你找了很久的...
  8. C#转换人民币大小金额
  9. hadoop组件官方源和国内源
  10. VSCode插件---Code Runner
  11. 北京大学肖臻老师《区块链技术与应用》公开课笔记-BTC
  12. LeetCode12. 整数转罗马数字 / 剑指 Offer 40. 最小的k个数 / 剑指 Offer 41. 数据流中的中位数
  13. java毕业设计乡镇卫生院信息管理mybatis+源码+调试部署+系统+数据库+lw
  14. 如何删除word中的长横线(由三个减号---自动生成)
  15. 武汉市服务业领军企业认定条件、流程及申报政策奖励补贴标准
  16. SSLOJ·谷仓的安保【DFS】
  17. 功能篇------android 实现“摇一摇”功能
  18. linux利用su -从普通用户切换root权限
  19. win10最简单定时关机命令
  20. CSS中的表格(一)

热门文章

  1. java连接数据库hei_如何黑MySQL5数据库?(来自:http://superhei.blogbus.com)
  2. ios14的蓝牙弹窗_iOS14来了,总结一下给你带来了哪些最实用的功能
  3. spss process插件_SPSS教程:绘制调节效应图
  4. python legend位置_关于matplotlib-legend 位置属性 loc 使用说明
  5. linux向上翻页_linux学习基础篇——文件管理(一)
  6. python aiohttp_aiohttp
  7. java学jdk几_Java系列学习(一)-JDK下载与安装
  8. mysql子查询sysdate_Oracle向MySQL 迁移相关事项
  9. faceapp怎么合成未来宝宝照片_宝宝出生后,爸爸们应该如何宣布喜讯,各种官宣文案孕妈赶紧收藏...
  10. java工程师应该学习的知识点