注:本文說起到的代碼示例下載地址 - 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 3,VS Update 3, VS 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版本中的一些新的好東東(廢話半天了~):安全
標記聯合不知道這個翻譯是否精確?但確實是一個很是使人激動的新特性,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的類庫在作一些動做時將經常使用這個模式。
字符串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); } }
當咱們曾經第一次介紹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/
注意及申明:本文大致是全文翻譯。少數廢話部分是基於我我的的理解,在原文的基礎略做增刪。