TypeScript 是微軟開發(fā)的 JavaScript 的超集,TypeScript兼容JavaScript,可以載入JavaScript代碼然后運行。TypeScript與JavaScript相比進步的地方 包括:加入注釋,讓編譯器理解所支持的對象和函數(shù),編譯器會移除注釋,不會增加開銷;增加一個完整的類結(jié)構(gòu),使之更新是傳統(tǒng)的面向?qū)ο笳Z言。
為什么會有 TypeScript?
JavaScript 只是一個腳本語言,并非設(shè)計用于開發(fā)大型 Web 應(yīng)用,JavaScript 沒有提供類和模塊的概念,而 TypeScript 擴展了 JavaScript 實現(xiàn)了這些特性。TypeScript 主要特點包括:
TypeScript 是微軟推出的開源語言,使用 Apache 授權(quán)協(xié)議
TypeScript 是 JavaScript 的超集.
TypeScript 增加了可選類型、類和模塊
TypeScript 可編譯成可讀的、標準的 JavaScript
TypeScript 支持開發(fā)大規(guī)模 JavaScript 應(yīng)用
TypeScript 設(shè)計用于開發(fā)大型應(yīng)用,并保證編譯后的 JavaScript 代碼兼容性
TypeScript 擴展了 JavaScript 的語法,因此已有的 JavaScript 代碼可直接與 TypeScript 一起運行無需更改
TypeScript 文件擴展名是 ts,而 TypeScript 編譯器會編譯成 js 文件
TypeScript 語法與 JScript .NET 相同
TypeScript 易學(xué)易于理解
語法特性
類 Classes
接口 Interfaces
模塊 Modules
類型注解 Type annotations
編譯時類型檢查 Compile time type checking
Arrow 函數(shù) (類似 C# 的 Lambda 表達式)
JavaScript 的 TypeScript 的區(qū)別
TypeScript 是 JavaScript 的超集,擴展了 JavaScript 的語法,因此現(xiàn)有的 JavaScript 代碼可與 TypeScript 一起工作無需任何修改,TypeScript 通過類型注解提供編譯時的靜態(tài)類型檢查。TypeScript 可處理已有的 JavaScript 代碼,并只對其中的
TypeScript 代碼進行編譯。
在這一節(jié),我們將介紹TypeScript中的類型推斷。我們將會討論類型推斷需要在何處用到以及如何推斷。
基礎(chǔ)
在TypeScript中,在幾個沒有明確指定類型注釋的地方將會使用類型推斷來提供類型信息。
var x = 3;
變量"x"的值被推斷為number。這種推斷發(fā)生在變量或者成員初始化、設(shè)置參數(shù)默認值、決定函數(shù)返回類型的時候。
最佳公共類型
當(dāng)需要從多個表達式中進行類型推斷的時候,這些表達式的類型將會用來推斷出一個"最佳公共類型"。例如:
var x = [0, 1, null];
要想推斷出什么例子中"x"的類型,我們需要考慮每個數(shù)組元素的類型。這里,我們給出了兩個數(shù)組類型的選擇:number和null。最佳公共類型算法要求考慮到所有候選的類型,并選擇出與所有候選類型兼容的類型。(這里的類型可為Array<number>)
由于最佳公共類型是從提供的候選類型中選擇的,有些情況下,候選類型共享一個共同類型,但沒有任何一個類型是所有候選類型的父類型。例如:
class Animal {
name:string;
constructor(theName: string) { this.name = theName; }
}
class Snake extends Animal{
constructor(name: string) { super(name); }
}
class Elephant extends Animal{
constructor(name: string) { super(name); }
}
class Rhino extends Animal {
constructor(name: string) { super(name); }
}
var zoo = [new Rhino(), new Elephant(), new Snake()]; // 這里三個成員的類型分別為:Rhino、Elephant、Snake 他們是最佳公共類型的候選類型,Animal是他們的super type(譯為父類型)
理想情況下,我們可能希望zoo被推斷為Animal[]類型,但是因為數(shù)組中沒有任何對象是嚴格的Animal類型,我們便不能做出推斷。為了解決這個問題,當(dāng)不能推斷出所有候選類型的父類型的時候,我們需要明確的提供類型。
var zoo: Animal[] = [new Rhino(), new Elephant(), new Snake()];
當(dāng)沒有最佳公共類型的時候,推斷的結(jié)果是產(chǎn)生一個空對象,{}。因為這個類型不含任何成員,對于其任何屬性的訪問都會導(dǎo)致錯誤。這種結(jié)果依然允許我們在忽略類型的方式中使用對象,但在保障類型安全的前提下,該對象的類型不能被隱式的確定。
上下文(語境)類型
在TypeScript中,類型推斷在某些情況下也存在于"其他方面"。這被稱為"上下文歸類"。上下文歸類發(fā)生在當(dāng)一個表達式的類型在其所在的上下文中被隱式的指定的時候。例如:
window.onmousedown = function(mouseEvent) {
console.log(mouseEvent.buton); //<- 編譯時拋出錯誤
};
上面的代碼將會給出一個類型錯誤,TypeScript的類型檢查器使用Window.onmousedown函數(shù)的類型來推斷右邊的函數(shù)表達式類型。當(dāng)它這么做的時候,便能夠推斷出參數(shù)mouseEvent的類型。 如果這個表達式不在可進行上下文歸類的位置,參數(shù)mouseEvent 需要給定一個any類型,這樣就不會出現(xiàn)錯誤了。
如果需要上下文歸類的表達式內(nèi)容中包含明確的類型信息,則會忽略上下文歸類。我們重寫上面的例子:
window.onmousedown = function(mouseEvent: any) {
console.log(mouseEvent.buton); //<- 現(xiàn)在不會報錯了
};
參數(shù)明確指定類型的函數(shù)表達式將會忽略上下文歸類。經(jīng)過這樣的處理就不會報錯了,因為沒有應(yīng)用到上下文歸類。
上下文歸類可應(yīng)用于許多場景。常見的場景包括函數(shù)調(diào)用的參數(shù)、賦值的等號右邊表達式、類型確定、對象成員和數(shù)組字面量、返回值語句。上下文類型也作為最佳公共類型的候選類型。例如:
function createZoo(): Animal[] {
return [new Rhino(), new Elephant(), new Snake()];
}
在這個例子中,最佳公共類型有四個候選類型:Animal,Rhino,Elephant,和Snake。其中,Animal可以作為最佳公共類型。
形式有點像數(shù)學(xué)中的求最小公倍數(shù)...