注:本文提及到的代码示例下载地址 - Runnable sample to introduce Typescript 2.0 RC new features

作为一个Javascript的超集, TypeScript是微软继C#后最受人瞩目的明星语言, 日前TypeScript2.0候选版已于八月底发布,正式版也很快很快的要出来了。

废话少说,使用TypeScript 2.0候选版(RC)的第一步,你需要先下载 TypeScript 2.0 RC for Visual Studio 2015 (VS Update 3VS Update 3VS Update 3!重要的事情说三遍,一切一切的前提是你必须先安装VS Update 3), 通过NuGet 或者 npm安装:

npm install -g typescript@rc

号外:Visual Studio Code用户可以根据这个步骤使用候选版免费广告:这里我要强烈推荐VS Code,好东东啊,有超越宇宙第一IDE VS的趋势。啥Atom啊, notepad啊, 都可以丢一边去了!

基本上候选版(RC)已经无线接近于2.0正式版了,目前微软TypeScript团队通过RC版本广泛的倾听用户的反馈,以保证最终正式版的稳定。根据微软的一贯传统,原则上候选版出来后就不会有太大改动,所以一些修改太大的功能、语法啥的大伙可以提,但不要有太大期望正式版会出来。

由于之前大部分功能在2.0Beta版本已经出来了,所以这次主要说一说RC版本中的一些新的好东东(废话半天了~):

标记联合(Tagged Unions)

标记联合不知道这个翻译是否精确?但确实是一个非常令人激动的新特性,TypeScript把这种F#, Swift, Rust等语言才有的特性带给了Javascript。标记联合也叫可识别联合,不相交联合或者代数数据类型。不过名字只是一个代号,功能特性才是真正令人觉得有意思的事儿。

举例:比方说你定义了两个类型:Circle(圆形) 和Square(正方形)。 然后你定义一个功能类型Shape(形状):

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

你可能会注意到, Circle 和Square这两个接口都有一个叫kind的字符串String类型的定义。这意味着Circle中kind字段总是包含一个"circle" string类型。 每一个接口类型都有一个共同的字段kind,但是这个字段在两个接口中其各自唯一的不同的值circle和square。

在TypeScript 1.8中,我们需要写下面这样的一个方法,从而获取一个形状的面积:

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

这里我们为shape定义了一个中间变量c和sq,仅仅为了使得代码简洁并容易理解一些。

但到了TypeScript 2.0, 就完全不必要这样定义啦。TypeScript 2.0可以根据kind字段值来理解如何区别他们,因此你可以这么写:

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

运行一下,完全不会报错,并且TypeScript可以在每个case的分支使用控件流分析查看shape真实的类型。事实上, 你甚至可以使用--noImplicitReturns 和即将到来的 --strictNullChecks 特性,以确保这些检查是全面的. PS: strictNullChecks会是啥东东?
标记联合特性使得今天的我们可以放心的在使用一些JavaScript模式的时候保证类型安全。比方说,类似Redux的类库在做一些动作时将常常使用这个模式。

更多的字面量(Literal)类型

字符串String literal类型曾经是TypeScript 1.8中的一个特性,这个特性非常有用. 不只是string类型,我们曾经确实想为string类型之外的一些类型提供Literal特性。在2.0版本中,每一个唯一的boolean类型, number以及枚举类型将拥有他们自己的Literal类型。撸码:

type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
let nums: Digit[] = [1, 2, 4, 8];
// Error! '16' isn't a 'Digit'!
nums.push(16);

使用标签联合(tagged unions), 我们可以更加自然的表达一些东东:

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

这里Result<T> 类型说明有的时候结果有可能是失败的。如果成功,它会有一个值;如果失败,会包含一个失败的理由。注意:那个值字段只能在成功的时候使用。

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

你可能已经注意到enum的成员也可以得到他们自己的类型。

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)、包含(Includes)、例外(Excludes)

当我们曾经第一次介绍tsconfig.json文件的时候,很多用户抱怨人工的列出文件是一件很痛苦的事情。TypeScript 1.6介绍了exclude字段从而略微减轻一些这方面的痛苦。尽管如此,大伙普遍认为这还是不够的。写出所有的单个文件的路径是件很麻烦的事情,而且当你忘记排除一些新文件的时候运行就会出问题。

TypeScript 2.0终于可以支持Globs(全局)啦。 Globs允许你使用通配符设置路径,使得你可以根据你的需要进行配置,从而避免之前冗余而麻烦的例举。

你也可以在已经存在的exclude的字段中使用新的include字段。我们这里举一个列子:不妨运行一下下面的代码进行测试,看是否编译正确:

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

TypeScript的globs支持以下通配符:

  • * 是为数字或者其他的非分隔符字符 (比方说 / 或者 \).
  • ? 是精确匹配一个非分隔符字符 .
  • **/ 是任意数量的子目录

下一个阶段

就像我们之前说的,TypeScript 2.0很快会到来,但是单独的尝试玩玩带2.0正式新特性的RC版本将帮助我们更好的倾听开发者社区的声音。有任何问题,我们欢迎你去GitHub告诉我们。

这篇博客大体介绍了一些TypeScript 2.0 RC版本的新特性,为了让大家切身体会一下这些功能,我们提供了一个可以运行的代码下载示例,供大家下载、学习使用。

代码示例下载地址:Runnable sample to introduce Typescript 2.0 RC new features

原文连接https://blogs.msdn.microsoft.com/typescript/2016/08/30/announcing-typescript-2-0-rc/

注意及申明:本文大体是全文翻译。少数废话部分是基于我个人的理解,在原文的基础略作增删。

TypeScript 2.0候选版(RC)已出,哪些新特性值得我们关注?的更多相关文章

  1. jQuery 3.0最终版发布,十大新特性眼前一亮

    jQuery 3.0在日前发布了最终的全新版本.从2014年10月,jQuery团队对这个主要大版本进行维护开始,web开发者社区便一直在期待着这一刻的到来,终于在2016年6月他们迎来了这一个最终板 ...

  2. Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1Python 3_x 新特性1python3.4新特性1python3.5新特性1值得关注的新特性1Pyth

    Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1 Python 3_x 新特性1 python3.4新特性1 python3.5新特性1 值得关注的新特性1 ...

  3. Atitit.mysql 5.0 5.5  5.6 5.7  新特性 新功能

    Atitit.mysql 5.0 5.5  5.6 5.7  新特性 新功能 1. MySQL  5.6    5 大新特性1 1.1. 优化器的改进1 1.2. InnoDB 改进1 1.3. 使用 ...

  4. Atitit.mysql 5.0 5.5  5.6 5.7  新特性 新功能

    Atitit.mysql 5.0 5.5  5.6 5.7  新特性 新功能 1. MySQL  5.6    5 大新特性1 1.1. 优化器的改进1 1.2. InnoDB 改进1 1.3. 使用 ...

  5. Vue 3.0 有哪些新特性值得我们提前了解

    一.迎接 Vue 3.0 简介 ​ Vue.js 作者兼核心开发者尤雨溪宣布 Vue 3.0 进入 Beta 阶段. 已合并所有计划内的 RFC 已实现所有被合并的 RFC Vue CLI 现在通过 ...

  6. PHP 7.4.0发布!一起看看有哪些新特性

    PHP 7.4.0 发布了,此版本标志着 PHP 7 系列的第四次特性更新. 看了英文手册后,发现其进行了许多改进,并带来了一些新特性,现在将这些新特性您: 1.Typed Properties 类型 ...

  7. Safari 11.0 已发布,新特性都在这儿了!

    Safari 11.0 兼容性 Safari 11.0 可运行于 iOS 11.0 和 macOS 10.1版本的系统环境,同时在macOS 10.12.6 和 10.11.6版本中也可以使用. Hi ...

  8. Microsoft Dynamics CRM 2016 增强版的解决方案(CRM新特性,开发者的福利)

    CRM在以前的版本中,如果你改变了一个字段(组织A)然后打算导入到其他组织(组织B),你必须创建一个解决方案,包括完整的实体,并导出导入.然而,如果其他团队成员正在相同的实体做了自定义但不想让这些变化 ...

  9. Atitit jquery  1.4--v1.11  v1.12  v2.0  3.0 的新特性

    Atitit jquery  1.4--v1.11  v1.12  v2.0  3.0 的新特性 1.1. Jquery1.12  jQuery 2.2 和 1.12 新版本发布 - OPEN资讯.h ...

随机推荐

  1. Linux资源管理-IO优先级

    前一篇博客介绍了利用 cgroup 来控制进程的 CPU和内存使用情况, 这次补上使用 cgroup 来控制进程的IO优先级的方法. 前提条件 如果想控制进程的IO优先级, 需要内核的支持, 内核编译 ...

  2. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息及ISBN码

    这一篇首先从allitebooks.com里抓取书籍列表的书籍信息和每本书对应的ISBN码. 一.分析需求和网站结构 allitebooks.com这个网站的结构很简单,分页+书籍列表+书籍详情页. ...

  3. iOS冰与火之歌(番外篇) - 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权

    iOS冰与火之歌(番外篇) 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权 蒸米@阿里移动安全 0x00 序 这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用 ...

  4. oracle函数案例以及分页案例

    --日期函数select sysdate from dual--返回两个日期select months_between(to_date('2017-1-7','yyyy-mm-dd'),to_date ...

  5. C#基础知识八之访问修饰符

    1.  类的访问修饰符 修饰符 访问权限 无或者internal 只能在同一个程序集中访问类 public 同一个程序集或引用该程序集的外部都可访问类 abstract或internal abstra ...

  6. 【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体

    注:本文适用.net 2.0+的winform项目 目的: 点击页面中的target="_blank"链接时,弹出新窗体 页面中有window.close()操作时,关闭窗体 上述 ...

  7. python 数据类型 ---字符串

    1. 字符串去除空白 ,strip() , 包括空格,tab键, 换行符 >>> name = " Frank " >>> name.strip ...

  8. 分布式文件系统 - FastDFS 简单了解一下

    别问我在哪里 也许我早已不是我自己,别问我在哪里,我一直在这里. 突然不知道说些什么了... 初识 FastDFS 记得那是我刚毕业后进入的第一家公司,一个技术小白进入到当时的项目组后,在开发中上传用 ...

  9. 性能卓越的js模板引擎--artTemplate

    artTemplate能够将数据与View视图的分离,充分利用 javascript 引擎特性,使得其性能无论在前端还是后端都有极其出色的表现. 在 chrome 下渲染效率测试中分别是知名引擎 Mu ...

  10. Flexible 弹性盒子模型之flex

    实例 让所有弹性盒模型对象的子元素都有相同的长度,忽略它们内部的内容: #main div { flex:1; } 复制 效果预览 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号. 紧跟 ...