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/ 

注意及申明:本文大致是全文翻譯。少數廢話部分是基於我我的的理解,在原文的基礎略做增刪。

相關文章
相關標籤/搜索