全面解讀TypeScript和JavaScript的區(qū)別
| 特征 | JavaScript | TypeScript |
|---|---|---|
| 類(lèi)型系統(tǒng) | 弱類(lèi)型 | 強(qiáng)類(lèi)型 |
| 靜態(tài)類(lèi)型檢查 | 無(wú) | 有 |
| 可選類(lèi)型注解 | 無(wú) | 有 |
| 類(lèi)型推斷 | 有 | 有 |
| 接口 | 無(wú) | 有 |
| 繼承 | 基于原型的繼承 | 基于類(lèi)的繼承 |
| 泛型 | 無(wú) | 支持 |
| 支持裝飾器 | 無(wú) | 支持 |
| 編譯時(shí)類(lèi)型檢查 | 不支持 | 支持 |
| 編譯后代碼可讀性 | 高 | 低 |
| 社區(qū)活躍度 | 非常高 | 非常高 |
總結(jié):
TypeScript 是 JavaScript 的超集,它在 JavaScript 的基礎(chǔ)上添加了強(qiáng)類(lèi)型、接口、類(lèi)、泛型等特性,并提供了靜態(tài)類(lèi)型檢查等工具,讓開(kāi)發(fā)者能夠在編寫(xiě)代碼時(shí)更加安全、高效、可靠。與 JavaScript 相比,TypeScript 具有更強(qiáng)的類(lèi)型系統(tǒng)、更嚴(yán)格的類(lèi)型檢查、更好的代碼可讀性和維護(hù)性等優(yōu)點(diǎn)。此外,TypeScript 的社區(qū)活躍度也非常高,它被越來(lái)越多的開(kāi)發(fā)者和公司所采用。
1.TypeScript 特性
TypeScript 是 Microsoft 開(kāi)發(fā)和維護(hù)的一種面向?qū)ο蟮木幊陶Z(yǔ)言。它是 JavaScript 的超集,包含了 JavaScript 的所有元素,可以載入 JavaScript 代碼運(yùn)行,并擴(kuò)展了 JavaScript 的語(yǔ)法。
推薦先精通JS的的前提下再學(xué)習(xí)TS;這樣更有利于同時(shí)學(xué)習(xí)兩門(mén)語(yǔ)言
TS一般用于大型項(xiàng)目,就像微信小程序底層庫(kù)是用TS實(shí)現(xiàn)的,而微信小程序自身即應(yīng)用層卻是以JS來(lái)實(shí)現(xiàn)的。
1.1 特點(diǎn)
TypeScript 具有以下特點(diǎn):
TypeScript 增加了靜態(tài)類(lèi)型、類(lèi)、模塊、接口和類(lèi)型注解
(強(qiáng)調(diào)代碼的模塊化,面向?qū)ο螅?/code>TypeScript 更適合用于開(kāi)發(fā)大型的應(yīng)用
(大型應(yīng)用=模塊的集成,大型應(yīng)用優(yōu)先需要易于維護(hù),小應(yīng)用優(yōu)先需要開(kāi)發(fā)效率)
1.2 差異
JavaScript 和 TypeScript 的主要差異
TypeScript 從核心語(yǔ)言方面和類(lèi)概念的模塑方面對(duì) JavaScript 對(duì)象模型進(jìn)行了擴(kuò)展。
JavaScript 代碼可以在無(wú)需任何修改的情況下與 TypeScript 一同工作,同時(shí)可以使用編譯器將 TypeScript 代碼轉(zhuǎn)換為 JavaScript。
TypeScript 通過(guò)類(lèi)型注解提供編譯時(shí)的靜態(tài)類(lèi)型檢查。
TypeScript提供了很多數(shù)據(jù)類(lèi)型,通過(guò)類(lèi)型對(duì)變量進(jìn)行限制,稱(chēng)之為類(lèi)型注解,使用類(lèi)型注解后,就不能夠隨意變更變量的類(lèi)型。 項(xiàng)目較大時(shí),變量類(lèi)型被變更的頻率就會(huì)增加,出錯(cuò)的概率就會(huì)提高,因此TS時(shí)強(qiáng)類(lèi)型的面向?qū)ο蟮摹?/p>
TypeScript 中的數(shù)據(jù)要求帶有明確的類(lèi)型,JavaScript不要求。
TypeScript 為函數(shù)提供了缺省參數(shù)值。
缺省參數(shù)使用主要規(guī)則:調(diào)用時(shí)你只能從最后一個(gè)參數(shù)開(kāi)始進(jìn)行省略,換句話(huà)說(shuō),如果你要省略一個(gè)參數(shù),你必須省略它后面所有的參數(shù)。
TypeScript 引入了 JavaScript 中沒(méi)有的“類(lèi)”概念。
TypeScript 中引入了模塊的概念,可以把聲明、數(shù)據(jù)、函數(shù)和類(lèi)封裝在模塊中。
學(xué)過(guò).NET 的同學(xué)也許會(huì)突然發(fā)現(xiàn),TS和C# 有點(diǎn)類(lèi)似,沒(méi)錯(cuò);這兩門(mén)語(yǔ)言都出自 微軟之手。。
1.3 優(yōu)勢(shì)
TypeScript 比 JavaScript 更好嗎?
1.3.1 JavaScript優(yōu)勢(shì)
根據(jù)我的描述,TS 似乎只是JS的一個(gè)更好的版本。
所以你可能會(huì)認(rèn)為T(mén)S會(huì)在不久的將來(lái)取代JavaScript。其實(shí)不然,我仍然相信JavaScript會(huì)有用武之地。
例如我們用TS開(kāi)發(fā)微信小程序難免會(huì)推遲項(xiàng)目的開(kāi)發(fā)周期,而用JS則更快完成。
復(fù)雜性是一個(gè)需要考慮的關(guān)鍵因素。
JavaScript 非常適合更簡(jiǎn)單的應(yīng)用程序,因?yàn)樗梢栽谒衅脚_(tái)(跨平臺(tái))上運(yùn)行并且非常輕量級(jí)。另外,與JS的最小開(kāi)銷(xiāo)相比,編譯TS代碼需要的時(shí)間和CPU資源對(duì)項(xiàng)目而言會(huì)更麻煩。
1.3.2 TypeScript優(yōu)勢(shì)
與JavaScript相比,TypeScript有很多好處。
TS 使代碼重構(gòu)變得更加容易,并且更強(qiáng)調(diào)顯式類(lèi)型,使開(kāi)發(fā)人員能夠掌握各種組件的交互方式。由于它支持編譯時(shí)調(diào)試,對(duì)于處理大型復(fù)雜應(yīng)用程序的團(tuán)隊(duì)來(lái)說(shuō),有一定的好處。
為任何項(xiàng)目設(shè)置TypeScript都是容易的。一些框架,如Angular,默認(rèn)使用TypeScript。因此,在我看來(lái)TypeScript更勝一籌。
什么時(shí)候應(yīng)該將項(xiàng)目遷移到TypeScript?
當(dāng)代碼的大小、復(fù)雜性和出錯(cuò)率增加時(shí),需要在編譯過(guò)程中確定具體問(wèn)題時(shí),就可以使用TypeScript。
TypeScript 還具有接口和訪問(wèn)修飾符,允許開(kāi)發(fā)人員在單個(gè)代碼庫(kù)上進(jìn)行協(xié)作和交互。因此,最好在項(xiàng)目一開(kāi)始就使用TypeScript。
但是你如果喜歡像Ember.js或Glimmer.js這樣的框架,那你就不會(huì)喜歡TypeScript,這些框架的首選是JavaScript。
2.代碼對(duì)比
typescript 定義學(xué)生類(lèi)
class Student{
name:string;
age:number;
}
var s1=new Student();
s1.name="Jim";
s1.age=20;
document.write("name:"+s1.name+" age:"+s1.age);我們?cè)賮?lái)看用TypeScript編譯以后的JavaScript代碼:
var Student = (function () {
function Student() {
}
return Student;
})();
var s1 = new Student();
s1.name = "Jim";
s1.age = 20;
document.write("name:" + s1.name + " age:" + s1.age);通過(guò)對(duì)代碼的對(duì)比,TypeScript代碼更簡(jiǎn)潔,更好理解,更易于維護(hù)。與C#,Java,C++類(lèi)似。
2.1 DEMO案列
先來(lái)看一個(gè)經(jīng)典的程序Hello World。代碼如下:
<script type="text/typescript"> var hw:string="Hello World!"; //定義一個(gè)字符串變量 document.write(<h1>"+hw+"</h1>); //將結(jié)果顯示在頁(yè)面上,這句話(huà)是不是很熟悉呢。 </script>
我們可以把javascript的代碼用到TypeScript里面運(yùn)行。上面的代碼是寫(xiě)在script標(biāo)簽中,類(lèi)型是typescript。如果想在頁(yè)面上直接編譯看到結(jié)果,還需要引用typescript.min.js與typescript.compile.min.js。
2.2如何引用
<html>
<head>
<title>demo</title>
</head>
<body>
<script type="text/typescript">
// TypeScript代碼
</script>
<script src="lib/typescript.min.js"></script>
<script src="lib/typescript.compile.min.js"></script>
</body>
</html>3.語(yǔ)法區(qū)別
3.1TypeScript 的基本數(shù)據(jù)類(lèi)型
TypeScript 的基本數(shù)據(jù)類(lèi)型有boolean、number 、string 、 array 、 enum 、any 、void。
- 如定義一個(gè)boolean的變量:
var isDone: boolean = false;
- JS與TS中的所有數(shù)值都是浮點(diǎn)型,而在TS中定義為“number”型。聲明一個(gè)number類(lèi)型的變量:
var isNumber:number=6; var isfloat:number=6.01;
- 使用一對(duì)雙引號(hào)(")或一對(duì)單引號(hào)(')來(lái)表示字符串
var name: string = "bob"; var family_name: string = 'Green';
- TypeScript 中數(shù)組使用“[]”來(lái)聲明,代碼如下:
var list: number[] = [1, 2, 3]; var name: string[] = ["阿龍","阿貓","阿狗"]; // 訪問(wèn)方式 var list: number[] = [1, 2, 3]; alert(list[0])); // 定義任意類(lèi)型的數(shù)組,關(guān)鍵字為Array. var arr:Array = [1,2,3,"a","b","c"]; // 任意類(lèi)型數(shù)組 alert(arr[1]);
3.1.1 enum
枚舉類(lèi)型是 TypeScript 中新添加的,而 JavaScript 中是沒(méi)有這個(gè)類(lèi)型的。用關(guān)鍵字enum來(lái)聲明。代碼示例如下:
enum Color {
Red, //枚舉元素列表
Green,
Blue
};
var c: Color = Color.Green;假如我們有一個(gè)數(shù)值,但是我們不知道枚舉類(lèi)型中是否有定義,可以用以下方式來(lái)獲取,代碼如下:
enum Color {
Red = 1,
Green,
Blue
};
var colorName: string = Color[2]; //訪問(wèn)第二個(gè)枚舉子元素Green
alert(colorName);
colorName = Color[4];
alert(colorName);那么將會(huì)輸出Green和undefined。因?yàn)镚reen的值是 2,而沒(méi)有一個(gè)枚舉定義的值是 4,所以返回undefined。
3.1.2 任意類(lèi)型 any
和 JavaScript 中變量的默認(rèn)類(lèi)型一樣,指代是動(dòng)態(tài)的,能夠賦予任意類(lèi)型。例如:
var notSure: any = 4; notSure = "maybe a string instead"; notSure = false; // 定義為boolen型
定義為any后,將失去語(yǔ)法感知的功能,就相當(dāng)于寫(xiě)JavaScript 一樣。值得一提的是,any可以配合數(shù)組來(lái)使用,代碼如下:
var list: any[] = [1, true, "free"]; list[1] = 100; //更改list[1]的值
請(qǐng)注意,不要濫用 any,如果任何值都指定為 any 類(lèi)型,那么 TypeScript 將失去它的意義。失去了type的script將是沒(méi)有意義的。
3.3.3 類(lèi)型void
void 和 any 相反,any 是表示任意類(lèi)型,而 void 是表示沒(méi)有任意類(lèi)型,就是什么類(lèi)型都不是,這在我們定義函數(shù),函數(shù)沒(méi)有返回值時(shí)會(huì)用到:
const consoleText = (text: string): void => {
console.log(text);
};void 類(lèi)型的變量只能賦值為 undefined 和 null,其他類(lèi)型不能賦值給 void 類(lèi)型的變量。
3.3.4 never類(lèi)型
never 類(lèi)型指那些永不存在的值的類(lèi)型,它是那些總會(huì)拋出異?;蚋静粫?huì)有返回值的函數(shù)表達(dá)式的返回值類(lèi)型,當(dāng)變量被永不為真的類(lèi)型保護(hù)所約束時(shí),該變量也是 never 類(lèi)型。
這個(gè)類(lèi)型比較難理解,我們先來(lái)看幾個(gè)例子:
const errorFunc = (message: string): never => {
throw new Error(message);
};這個(gè) errorFunc 函數(shù)總是會(huì)拋出異常,所以它的返回值類(lèi)型是 never,用來(lái)表明它的返回值是永不存在的。
const infiniteFunc = (): never => {
while (true) {}
};3.2 函數(shù)的定義與調(diào)用
在TypeScript中定義函數(shù)的語(yǔ)法為:
function function_name(arg:number,arg1:number,....):return_type{
code 函數(shù)要執(zhí)行的代碼;
return data;
}其中 function 為聲明函數(shù)的關(guān)鍵字,function_name 為自定義函數(shù)的名字,arg為參數(shù)列表,_returntype為該函數(shù)的返回值類(lèi)型,code為函數(shù)被調(diào)用時(shí)要執(zhí)行的代碼,使用return關(guān)鍵字返回?cái)?shù)據(jù),data為要返回的數(shù)據(jù),要使用“{}”括起來(lái)。函數(shù)的調(diào)用就很簡(jiǎn)單了,如下代碼:
function add(x: number, y: number): number { //定義返回值為number類(lèi)型的函數(shù)
return x+y;
}
add(5,6); //調(diào)用函數(shù)- 匿名函數(shù):
匿名函數(shù)是沒(méi)有名稱(chēng)只有主體的函數(shù),不需要指定返回類(lèi)型,它的返回值類(lèi)型是從函數(shù)主體內(nèi)的 return 語(yǔ)句推斷的。如下代碼:
var myAdd = function(x:number, y:number) { //定義匿名函數(shù)
return x+y;
};
myAdd(3,4); //調(diào)用匿名函數(shù)- 可選與默認(rèn)參數(shù)
可選參數(shù):在參數(shù)名后面,冒號(hào)前面添加一個(gè)問(wèn)號(hào),則表明該參數(shù)是可選的。如下代碼:
function buildName(firstName: string, lastName?: string) { //lastName為可選參數(shù)
if (lastName)
return firstName + " " + lastName;
else
return firstName;
}
var result1 = buildName("Bob"); //正確調(diào)用 Bob
var result2 = buildName("Bob", "Adams"); //正確調(diào)用 Bob Adams默認(rèn)參數(shù):在參數(shù)名后直接給定一個(gè)值,如果這個(gè)值沒(méi)有被傳入,那么將會(huì)被賦值為默認(rèn)值。如下代碼:
function buildName(firstName: string, lastName = "Smith") {
return firstName + " " + lastName;
}
var result1 = buildName("Bob"); //沒(méi)有傳入第二個(gè)參數(shù),則被賦值為默認(rèn)的smith,結(jié)果為:Bob Smith
var result2 = buildName("Bob", "Adams"); //結(jié)果為:Bob Adams注:可選參數(shù)和默認(rèn)參數(shù)必須在參數(shù)列表的最后。
3.3 TS的類(lèi)
3.3.1 類(lèi)的結(jié)構(gòu)及聲明
JavaScript語(yǔ)言基于函數(shù)和原型鏈繼承機(jī)制的方式構(gòu)建可重用的組件。這對(duì)于面向?qū)ο缶幊虂?lái)說(shuō)顯得比較笨拙。
在下一代的JavaScript標(biāo)準(zhǔn)將為我們提供基于class base的面向?qū)ο蟮脑O(shè)計(jì)方式。但在TypeScript中可以使用這種方式,它將編譯為目前大多數(shù)瀏覽器能允許的普通JavaScript代碼.
所以我們不用在等下一代Javascript標(biāo)準(zhǔn)的到來(lái)了。
類(lèi)是面向?qū)ο缶幊痰暮诵幕A(chǔ),是屬性和方法的集合,類(lèi)不能真接編寫(xiě)程序時(shí)引用,必須實(shí)例化后才能使用。
創(chuàng)建一個(gè)TypeScript類(lèi)時(shí),必須使用關(guān)鍵字class進(jìn)行聲明,該關(guān)鍵字后緊跟類(lèi)的名稱(chēng),之后用大括號(hào)將類(lèi)體進(jìn)行封裝,類(lèi)的基本聲明格式如下。
class 類(lèi)名{
//類(lèi)體
}創(chuàng)建完成類(lèi)的基本結(jié)構(gòu)后就可以編寫(xiě)類(lèi)體。類(lèi)體中主要包括屬性和方法的聲明及定義,當(dāng)然也可能在類(lèi)體中只定義屬性或只定義方法,甚至類(lèi)體內(nèi)可以不定義任何屬性。完整的類(lèi)的定義格式如下。
class 類(lèi)名{
name:string; //定義類(lèi)的屬性
fun(){ //定義類(lèi)的方法
//定義該方法所要實(shí)現(xiàn)的功能
}
}- 為什么可以不定義任何屬性?
- 類(lèi)可以被繼承,它的方法和屬性可以在子類(lèi)中被繼承
- 未定義任何方法的空類(lèi)可以作為泛型類(lèi)
- 綜上未定義任何方法的空類(lèi)其名稱(chēng)具有價(jià)值
構(gòu)造函數(shù)
class student{ //定義student類(lèi)
name:string; //定義類(lèi)的屬性
constructor(myname:string){ //定義構(gòu)造函數(shù)
this.name=myname;
}
study(){ //定義類(lèi)的方法
//定義該方法所要實(shí)現(xiàn)的功能
}
}用這種方式定義出來(lái)的類(lèi),感覺(jué)在寫(xiě)C#、Java或C++的程序,沒(méi)錯(cuò),TS就是面向?qū)ο蟮摹?/p>
3.3.2 類(lèi)的實(shí)例化
一般情況下,創(chuàng)建一個(gè)類(lèi)后并不能直接的對(duì)屬性和方法進(jìn)行引用,必須對(duì)類(lèi)進(jìn)行實(shí)例化,即創(chuàng)建一個(gè)對(duì)象。TypeScript中用new 關(guān)鍵字創(chuàng)建對(duì)象。實(shí)例化后通過(guò)“.”來(lái)訪問(wèn)屬性和方法。實(shí)例代碼如下:
class student{ //定義student類(lèi)
name:string; //定義類(lèi)的屬性
constructor(myname:string){ //定義帶參數(shù)的構(gòu)造函數(shù)
this.name=myname;
}
study(){ //定義類(lèi)的方法
document.write("<h1> My name is "+this.name+".</h1>");
}
write():string{
return "write name:"+this.name;
}
}類(lèi)的使用
var s1=new student("Jim");
document.write("<h1>"+s1.name+"</h1>"); //獲取name屬性
s1.study(); // 調(diào)用study方法
document.write("<h1>"+s1.write()+"</h1>");3.4 TS的模塊
我們先舉個(gè)例子,比如數(shù)據(jù)驗(yàn)證,我們需要驗(yàn)證用戶(hù)數(shù)字的內(nèi)容是否是數(shù)字或者字母時(shí),需要使用正則表達(dá)式。
var lettersRegexp = / ^ [A-Za-z]+$/; var numberRegexp = / ^ [0-9]+$/;
數(shù)據(jù)驗(yàn)證可改善用戶(hù)體驗(yàn)防止輸入錯(cuò)誤的信息,在學(xué)了前面的知識(shí),我們很可能會(huì)寫(xiě)出以下代碼:
// 驗(yàn)證的封裝
interface StringValidator { //定義驗(yàn)證接口
isAcceptable(s: string): boolean;
}
var lettersRegexp = /^[A-Za-z]+$/;
var numberRegexp = /^[0-9]+$/;
class LettersOnlyValidator implements StringValidator { //實(shí)現(xiàn)接口
isAcceptable(s: string) {
return lettersRegexp.test(s);
}
}
class ZipCodeValidator implements StringValidator { //實(shí)現(xiàn)接口
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
// 驗(yàn)證的過(guò)程
var strings = ['Hello', '98052', '101'];
var validators: { [s: string]: StringValidator; } = {};
validators['ZIP code'] = new ZipCodeValidator(); //實(shí)例化類(lèi)
validators['Letters only'] = new LettersOnlyValidator(); //實(shí)例化類(lèi)
for(var i=0;i<strings.length;i++){
for (var name in validators) {
document.write('"' + strings[i] + '" ' + (validators[name].isAcceptable(strings[i]) ? ' matches ' : ' does not match ') + name+"
"); //調(diào)用類(lèi)的方法
}
}- 那么這段代碼最大的問(wèn)題是什么呢?
- 一個(gè)是沒(méi)法復(fù)用,驗(yàn)證的封裝
interface StringValidatorLettersOnlyValidatorZipCodeValidator和驗(yàn)證的過(guò)程即 下面的 方法 在同一個(gè)文件,驗(yàn)證的封裝已經(jīng)是可以復(fù)用的。 - 另一個(gè)是接口和兩個(gè)實(shí)現(xiàn)的類(lèi)都直接掛接在全局變量上,假如數(shù)量一多的話(huà),將會(huì)影響整個(gè)全局變量,如果把類(lèi)的內(nèi)部類(lèi)和類(lèi)的內(nèi)部方法分離開(kāi),就會(huì)提高模塊化,強(qiáng)化面向?qū)ο筇卣鳌?/li>
- 而TypeScritp中模塊的出現(xiàn)給我們解決了這一問(wèn)題。
- 使用 module 關(guān)鍵字來(lái)定義模塊,并在末尾加花括號(hào)即可用;
- 用export 關(guān)鍵字使接口、類(lèi)等成員對(duì)模塊外可見(jiàn)。
module Validation { //定義模塊
export interface StringValidator { //聲明接口對(duì)外部可以使用
isAcceptable(s: string): boolean;
}
var lettersRegexp = /^[A-Za-z]+$/;
var numberRegexp = /^[0-9]+$/;
export class LettersOnlyValidator implements StringValidator { //聲明類(lèi)對(duì)外部可用
isAcceptable(s: string) {
return lettersRegexp.test(s);
}
}
export class ZipCodeValidator implements StringValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
}3.4.1 模塊內(nèi)容的調(diào)用
在前面一節(jié)中我學(xué)習(xí)了模塊的聲明,而在模塊聲明完成以后,我們就可以調(diào)用這個(gè)模塊了,調(diào)用模塊中的接口、類(lèi)、方法等。調(diào)用方法簡(jiǎn)單,就是用模塊名后面跟一個(gè)點(diǎn)來(lái)調(diào)用類(lèi)、接口、方法等。如下代碼:
var strings = ['Hello', '98052', '101'];
var validators: { [s: string]: Validation.StringValidator; } = {};
validators['ZIP code'] = new Validation.ZipCodeValidator(); //使用模塊中的類(lèi)
validators['Letters only'] = new Validation.LettersOnlyValidator();
// 顯示匹配結(jié)果
for(var i=0;i<strings.length;i++){
for (var name in validators) {
document.write('"' + strings[i] + '" ' + (validators[name].isAcceptable(strings[i]) ? ' matches ' : ' does not match ') + name+"<br>"); // 使用方法
}
}3.4.2 分隔模塊到多個(gè)文件
隨著我們項(xiàng)目的擴(kuò)展,我們的代碼總不可能只寫(xiě)在一個(gè)文件里。為了更好地維護(hù)項(xiàng)目,我們會(huì)將特定功能放到一個(gè)文件里,然后加載多個(gè)文件實(shí)現(xiàn)我們想需要的功能?,F(xiàn)在我們先將上面的代碼分割到多個(gè)文件里。
文件一 Validation.ts
module Validation {
export interface StringValidator {
isAcceptable(s: string): boolean;
}
}文件二 LettersOnlyValidator.ts
/// <reference path="Validation.ts" />
module Validation {
var lettersRegexp = /^[A-Za-z]+$/;
export class LettersOnlyValidator implements StringValidator {
isAcceptable(s: string) {
return lettersRegexp.test(s);
}
}
}文件三 ZipCodeValidator.ts
/// <reference path="Validation.ts" />
module Validation {
var numberRegexp = /^[0-9]+$/;
export class ZipCodeValidator implements StringValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
}文件四 Test.ts
/// <reference path="Validation.ts" />
/// <reference path="LettersOnlyValidator.ts" />
/// <reference path="ZipCodeValidator.ts" />
var strings = ['Hello', '98052', '101'];
var validators: { [s: string]: Validation.StringValidator; } = {};
validators['ZIP code'] = new Validation.ZipCodeValidator();
validators['Letters only'] = new Validation.LettersOnlyValidator();
for(var i=0;i<strings.length;i++){
for (var name in validators) {
document.write('"' + strings[i] + '" ' + (validators[name].isAcceptable(strings[i]) ? ' matches ' : ' does not match ') + name+"<br>"); //調(diào)用類(lèi)的方法
}
}在項(xiàng)目中新建好以上四個(gè)文件,然后我們編譯項(xiàng)目,如果我們代碼編寫(xiě)沒(méi)錯(cuò)的話(huà),是能夠編譯通過(guò)的。
我們可以見(jiàn)到后面三個(gè)文件開(kāi)頭有類(lèi)似于 C# 的文檔注釋?zhuān)?/p>
/// < reference path=“Validation.ts” />
/// < reference path=“LettersOnlyValidator.ts” />
/// < reference path=“ZipCodeValidator.ts” />這是告訴 TypeScript 編譯器該文件依賴(lài)于哪些文件,假如依賴(lài)的文件不存在的話(huà),編譯就會(huì)不通過(guò)。當(dāng)然我們不寫(xiě)也是可以的,只不過(guò)編譯器在編譯時(shí)不會(huì)幫我們檢查,一般來(lái)說(shuō),還是建議寫(xiě)上。
3.4.3 TS的編譯
我們知道.js的文件可以直接在瀏覽器中運(yùn)行的,而.ts或者.tsx卻不行,所以我們?cè)谶\(yùn)行TS項(xiàng)目時(shí)需要編譯成瀏覽器引擎可以識(shí)別的JS語(yǔ)言。同時(shí)為了提高編譯速度,我們可以將穩(wěn)定的module提前編譯成js文件放到工程中,這樣下次編譯就會(huì)直接跳過(guò)該nodule的編譯。在引用編譯生成的 JavaScript 文件時(shí),我們需要注意好順序。以上面的代碼為例,我們?cè)?Html 代碼中這么引用。
<script src="Validation.js" type="text/javascript"/> <script src="LettersOnlyValidator.js" type="text/javascript"/> <script src="ZipCodeValidator.js" type="text/javascript"/> <script src="Test.js" type="text/javascript"/>
到此這篇關(guān)于全面解讀TypeScript和JavaScript的區(qū)別的文章就介紹到這了,更多相關(guān)TypeScript和JavaScript的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js點(diǎn)擊時(shí)關(guān)閉該范圍下拉菜單之外的菜單方法
下面小編就為大家分享一篇js點(diǎn)擊時(shí)關(guān)閉該范圍下拉菜單之外的菜單方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
解決webpack多頁(yè)面內(nèi)存溢出的方法示例
這篇文章主要介紹了解決webpack多頁(yè)面內(nèi)存溢出的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
JavaScript中的null和undefined用法解析
這篇文章主要介紹了JavaScript中的null和undefined用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
D3.js實(shí)現(xiàn)拓?fù)鋱D的示例代碼
本篇文章主要介紹了D3.js實(shí)現(xiàn)拓?fù)鋱D的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
微信小程序scroll-view橫向滑動(dòng)嵌套for循環(huán)的示例代碼
這篇文章主要介紹了微信小程序scroll-view橫向滑動(dòng)嵌套for循環(huán)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
微信小程序+騰訊地圖開(kāi)發(fā)實(shí)現(xiàn)路徑規(guī)劃繪制
這篇文章主要介紹了微信小程序+騰訊地圖開(kāi)發(fā)實(shí)現(xiàn)路徑規(guī)劃繪制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05

