介紹
為了讓程序有價(jià)值姻氨,我們需要能夠處理最簡單的數(shù)據(jù)單元:數(shù)字掸宛,字符串,結(jié)構(gòu)體馅精,布爾值等严嗜。 TypeScript支持與JavaScript幾乎相同的數(shù)據(jù)類型,此外還提供了實(shí)用的枚舉類型方便我們使用洲敢。
如果你是.Neter 漫玄,學(xué)習(xí)TypeScript的曲線將大大降低,因?yàn)槠浜芏嗾Z法都和C#類似压彭,畢竟“同父”嘛睦优!
布爾值
最基本的數(shù)據(jù)類型就是簡單的true/false值,在JavaScript和TypeScript里叫做boolean(其它語言中也一樣)壮不。
let isDone: boolean = false;
數(shù)字
和JavaScript一樣汗盘,TypeScript里的所有數(shù)字都是浮點(diǎn)數(shù)。 這些浮點(diǎn)數(shù)的類型是 number询一。 除了支持十進(jìn)制和十六進(jìn)制字面量隐孽,Typescript還支持ECMAScript 2015中引入的二進(jìn)制和八進(jìn)制字面量癌椿。
let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;
let binaryLiteral: number = 0b1010;
let octalLiteral: number = 0o744;
字符串
JavaScript程序的另一項(xiàng)基本操作是處理網(wǎng)頁或服務(wù)器端的文本數(shù)據(jù)。 像其它語言里一樣菱阵,我們使用 string表示文本數(shù)據(jù)類型踢俄。 和JavaScript一樣,可以使用雙引號( ")或單引號(')表示字符串晴及。
let name: string = "bob";
name = "smith";
你還可以使用模版字符串都办,它可以定義多行文本和內(nèi)嵌表達(dá)式。 這種字符串是被反引號包圍( `)虑稼,并且以${ expr }這種形式嵌入表達(dá)式
let name: string = `Gene`;
let age: number = 37;
let sentence: string = `Hello, my name is ${ name }.
I'll be ${ age + 1 } years old next month.`;
注意這里是反引號而不是字符串的單引號琳钉,而且這里的的字符串拼接形式和MVC6的新特性一樣,對于.Neter是不是很爽爸刖搿歌懒!
這與下面定義sentence的方式效果相同:
let sentence: string = "Hello, my name is " + name + ".\n\n" +
"I'll be " + (age + 1) + " years old next month.";
數(shù)組
TypeScript像JavaScript一樣可以操作數(shù)組元素。 有兩種方式可以定義數(shù)組胰蝠。 第一種歼培,可以在元素類型后面接上[]震蒋,表示由此類型元素組成的一個數(shù)組:
let list: number[] = [1, 2, 3];
第二種方式是使用數(shù)組泛型茸塞,Array<元素類型>:
let list: Array<number> = [1, 2, 3];
元組 Tuple
元組類型允許表示一個已知元素?cái)?shù)量和類型的數(shù)組,各元素的類型不必相同查剖。 比如钾虐,你可以定義一對值分別為string和number類型的元組。
// Declare a tuple type
let x: [string, number];
// Initialize it
x = ['hello', 10]; // OK
// Initialize it incorrectly
x = [10, 'hello']; // Error
當(dāng)訪問一個已知索引的元素笋庄,會得到正確的類型:
console.log(x[0].substr(1)); // OK
console.log(x[1].substr(1)); // Error, 'number' does not have 'substr'
當(dāng)訪問一個越界的元素效扫,會使用聯(lián)合類型替代:
x[3] = 'world'; // OK, 字符串可以賦值給(string | number)類型
console.log(x[5].toString()); // OK, 'string' 和 'number' 都有 toString
x[6] = true; // Error, 布爾不是(string | number)類型
聯(lián)合類型是高級主題,我們會在以后的章節(jié)里討論它直砂。
枚舉
enum類型是對JavaScript標(biāo)準(zhǔn)數(shù)據(jù)類型的一個補(bǔ)充菌仁。 像C#等其它語言一樣,使用枚舉類型可以為一組數(shù)值賦予友好的名字静暂。
enum Color {Red, Green, Blue};
let c: Color = Color.Green;
默認(rèn)情況下济丘,從0開始為元素編號。 你也可以手動的指定成員的數(shù)值洽蛀。 例如摹迷,我們將上面的例子改成從 1開始編號:
enum Color {Red = 1, Green, Blue};
let c: Color = Color.Green;
或者,全部都采用手動賦值:
enum Color {Red = 1, Green = 2, Blue = 4};
let c: Color = Color.Green;
枚舉類型提供的一個便利是你可以由枚舉的值得到它的名字郊供。 例如峡碉,我們知道數(shù)值為2,但是不確定它映射到Color里的哪個名字驮审,我們可以查找相應(yīng)的名字:
enum Color {Red = 1, Green, Blue};
let colorName: string = Color[2];
alert(colorName);
任意值
有時候鲫寄,我們會想要為那些在編程階段還不清楚類型的變量指定一個類型吉执。 這些值可能來自于動態(tài)的內(nèi)容,比如來自用戶輸入或第三方代碼庫地来。 這種情況下鼠证,我們不希望類型檢查器對這些值進(jìn)行檢查而是直接讓它們通過編譯階段的檢查。 那么我們可以使用 any類型來標(biāo)記這些變量:
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
在對現(xiàn)有代碼進(jìn)行改寫的時候靠抑,any類型是十分有用的量九,它允許你在編譯時可選擇地包含或移除類型檢查。 你可能認(rèn)為 Object有相似的作用颂碧,就像它在其它語言中那樣荠列。 但是 Object類型的變量只是允許你給它賦任意值 -- 但是卻不能夠在它上面調(diào)用任意的方法,即便它真的有這些方法:
let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check)
let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.
當(dāng)你只知道一部分?jǐn)?shù)據(jù)的類型時载城,any類型也是有用的肌似。 比如,你有一個數(shù)組诉瓦,它包含了不同的類型的數(shù)據(jù):
let list: any[] = [1, true, "free"];
list[1] = 100;
空值
某種程度上來說川队,void類型像是與any類型相反,它表示沒有任何類型睬澡。 當(dāng)一個函數(shù)沒有返回值時固额,你通常會見到其返回值類型是 void:
function warnUser(): void {
alert("This is my warning message");
}
聲明一個void類型的變量沒有什么大用,因?yàn)槟阒荒転樗x予undefined和null:
let unusable: void = undefined;
類型斷言
有時候你會遇到這樣的情況煞聪,你會比TypeScript更了解某個值的詳細(xì)信息斗躏。 通常這會發(fā)生在你清楚地知道一個實(shí)體具有比它現(xiàn)有類型更確切的類型。
通過類型斷言這種方式可以告訴編譯器昔脯,“相信我啄糙,我知道自己在干什么”。 類型斷言好比其它語言里的類型轉(zhuǎn)換云稚,但是不進(jìn)行特殊的數(shù)據(jù)檢查和解構(gòu)隧饼。 它沒有運(yùn)行時的影響,只是在編譯階段起作用静陈。 TypeScript會假設(shè)你燕雁,程序員,已經(jīng)進(jìn)行了必須的檢查窿给。
類型斷言有兩種形式贵白。 其一是“尖括號”語法:
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
另一個為as語法:
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
這里的類型轉(zhuǎn)換有沒有眼熟的趕腳,說得對崩泡,就是C#的類型轉(zhuǎn)換方法禁荒,只是第一種方法是用<>代替了()
兩種形式是等價(jià)的。 至于使用哪個大多數(shù)情況下是憑個人喜好角撞;然而呛伴,當(dāng)你在TypeScript里使用JSX時勃痴,只有 as語法斷言是被允許地。
關(guān)于let
你可能已經(jīng)注意到了热康,我們使用let關(guān)鍵字來代替大家所熟悉的JavaScript關(guān)鍵字var沛申。 let關(guān)鍵字是JavaScript的一個新概念,TypeScript實(shí)現(xiàn)了它姐军。 我們會在以后詳細(xì)介紹它铁材,很多常見的問題都可以通過使用 let來解決,所以盡可能地使用let來代替var吧奕锌。