這裏列舉了兩個主要的目的javascript
你獲取想知道爲何要給javascript添加類型系統呢?java
類型系統已經被證實是一種能夠加強代碼質量和可讀性的能力,大型團隊(例如谷歌,微軟,facebook)都在印證着這個結論,更具體點說:git
typescript會盡可能保持一個低門檻,來保證開發者能夠低成本的學習編寫ts代碼github
typescript爲js提供了編譯時的類型檢查,最棒的是類型徹底是可選的,你的js代碼(.js文件)能夠重命名成(.ts)文件,typescript一樣會返回和原有js文件同樣的輸出。經過可選的類型檢查,typescript就是嚴格的js超集。算法
在代碼開發階段,typescript會盡量用比較低的成本去推斷儘量多的類型信息,例如,在接下來的例子中,typescript將會知道foo是number類型,當在第二行代碼中又給foo賦值爲一個字符串類型的值時,就會報出錯誤typescript
var foo = 123;
foo = '456'; // Error: cannot assign `string` to `number`
複製代碼
這種類型推斷具備良好的動機,若是你也有像上述例子類似的場景,在接下來的代碼中,並不肯定foo究竟是number類型仍是string類型,這樣的問題在大型的多文件代碼庫中常常能碰到,咱們稍後會繼續深刻了解類型推斷的規則。安全
根據咱們在以前提到的,typescript將會盡能安全的進行類型的推斷,然而,也可使用註解去明確達到下面兩個目的函數
typescript是用尾隨式的類型註解學習
var foo: number = 123;
複製代碼
下面這個例子編譯器將會拋出一個errorthis
var foo: number = '123'; // Error: cannot assign a `string` to a `number`
複製代碼
咱們會在後續章節討論註解語法的細節
在typescript中,咱們想讓js開發者以更小的學習成原本編寫ts代碼,因此類型都是結構化的,這意味着,」鴨子類型「是一種類(class)語言優先的結構,考慮下面這個例子,函數iTakePoint2D將會接收任何包含了x和y的對象做爲參數
interface Point2D {
x: number;
y: number;
}
interface Point3D {
x: number;
y: number;
z: number;
}
var point2D: Point2D = { x: 0, y: 10 }
var point3D: Point3D = { x: 0, y: 10, z: 20 }
function iTakePoint2D(point: Point2D) { /* do something */ }
iTakePoint2D(point2D); // exact match okay
iTakePoint2D(point3D); // extra information okay
iTakePoint2D({ x: 0 }); // Error: missing information `y`
複製代碼
爲了使js代碼遷移到ts代碼更爲簡單,即便是有編譯錯誤,默認的,typescript也會觸發有效的js代碼使其正常執行
var foo = 123;
foo = '456'; // Error: cannot assign a `string` to a `number`
複製代碼
等價於觸發下面這段js代碼
var foo = 123;
foo = '456';
複製代碼
因此從js代碼過渡到ts代碼能夠採用逐漸更新升級的策略,這也是ts不一樣於其餘語言編譯器工做以及遷移到ts的緣由
typescript的一個主要的設計目標就是能夠在typescript儘量簡單和安全的使用已經存在的js庫,typescript經過聲明(declaration)來達到這個目的,typescript提供了一個可變的比例針對你想在聲明文件中放置多少聲明信息,聲明的越具體,類型檢測和代碼提示就越詳細,注意,針對大多數流行的js庫已經有寫好的聲明文件[github.com/borisyankov…](DefinitelyTyped community), 因此針對大多數的目的:
爲了快速定義一個本身的聲明文件,以jQuery爲例,默認的,在你使用一個變量以前,typescript都指望你首先要聲明它
$('.awesome').show(); // Error: cannot find name `$`
複製代碼
爲了快速解決這個問題,你能夠告訴typescript,這裏確實有一個叫作$的傢伙
declare var $: any;
$('.awesome').show(); // Okay!
複製代碼
若是你想基於這個基礎的定義來提供更多的信息以防止出現編譯error,能夠這樣作
declare var $: {
(selector:string): any;
};
$('.awesome').show(); // Okay!
$(123).show(); // Error: selector needs to be a string
複製代碼
typescript提供了不少新特性針對當前的js引擎,typescript團隊也在積極的添加這些特性,這份特性列表也會隨着時間變得愈來愈豐富,這裏以一個class爲例。
class Point {
constructor(public x: number, public y: number) {
}
add(point: Point) {
return new Point(this.x + point.x, this.y + point.y);
}
}
var p1 = new Point(0, 10);
var p2 = new Point(10, 20);
var p3 = p1.add(p2); // { x: 10, y: 30 }
複製代碼