〔译〕TypeScript 2.0 候选版宣布

相干链接

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 反应给我们。我们异常情愿听到你尝试以后给我们的反应。祝兴奋!

    原文作者:边城
    原文地址: https://segmentfault.com/a/1190000006845790
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞