TypeScript 2.0候选版(RC)已出,哪些新特性值得咱们关注?

注:本文说起到的代码示例下载地址 - Runnable sample to introduce Typescript 2.0 RC new featuresgit

 

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

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

npm install -g typescript@rc

 

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

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

因为以前大部分功能在2.0Beta版本已经出来了,因此此次主要说一说RC版本中的一些新的好东东(废话半天了~):安全

标记联合(Tagged Unions)

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

举例:比方说你定义了两个类型: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中,咱们须要写下面这样的一个方法,从而获取一个形状的面积:fetch

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/ 

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

相关文章
相关标签/搜索