〔譯〕TypeScript 2.0 候選版發佈

相關連接

TypeScript 2.0 正式版已經發布了:〔譯〕TypeScript 2.0 正式版發佈
不過可能你們更關心的是 〔譯〕TypeScript 2.0 的新特性html


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

TypeScript 2.0 候選發行版(RC)出來了,離 TypeScript 2.0 最終發佈也就不遠了,贊!若是你還沒開始使用 TypeScript,能夠先看看網站上的教程git

要使用 RC 版本,能夠下載 TypeScript 2.0 RC for Visual Studio 2015(須要 VS2015 Update 3);也能夠經過 NuGet 下載,或者像下面這樣使用 npm:程序員

npm install -g typescript@rc

Visual Studio Code 用戶想使用 RC 版本請參考這裏github

這個 RC 版本讓你們看到 2.0 正式版的樣子,咱們經過這個版本普遍收集用戶反饋,將 2.0 打造得更加穩定可靠。總的來講,通常狀況下 RC 版本已經足夠穩定了,而且咱們不但願再往上加新的特性。typescript

不過,自 2.0 Beta 發佈以來,已經加了很多東西,因此下面可能會有你還沒有據說的新特性。npm

推斷類型(Tagged Unions)

譯者注json

對於 Tagged Unions 的翻譯,我查了不少資料,在 wiki 上找到以下描述:a tagged union, also called a variant, variant record, discriminated union, disjoint union, or sum type。其中 Variant 這個說法在 VB 中十分經常使用。在參考了 C# 對 var 關鍵字的翻譯以後,我決定將其翻譯爲「推斷類型」。segmentfault

推斷類型是一種數據結構,很像聯合(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 反饋給咱們。咱們很是願意聽到你嘗試以後給咱們的反饋。祝愉快!

相關文章
相關標籤/搜索