鍍金池/ 教程/ HTML/ 介紹
初始化項(xiàng)目結(jié)構(gòu)
聯(lián)合類(lèi)型
介紹
介紹
介紹
編譯選項(xiàng)
TypeScript 1.6
介紹
介紹
發(fā)展路線(xiàn)圖
介紹
在MSBuild里使用編譯選項(xiàng)
可迭代性
TypeScript 1.3
介紹
介紹
TypeScript 1.1
變量聲明
即將到來(lái)的Angular 2框架是使用TypeScript開(kāi)發(fā)的。 因此Angular和TypeScript一起使用非常簡(jiǎn)單方便
tsconfig.json
介紹
介紹
介紹
在MSBuild里使用編譯選項(xiàng)
使用TypeScript的每日構(gòu)建版本
新建工程
枚舉
三斜線(xiàn)指令
結(jié)合ASP.NET v5使用TypeScript
TypeScript里的this
介紹
TypeScript 1.4
編碼規(guī)范
介紹
模塊解析
ASP.NET 4
架構(gòu)概述
介紹
介紹
ASP.NET Core
TypeScript 1.8
介紹
介紹
創(chuàng)建簡(jiǎn)單工程
TypeScript 1.7
TypeScript 1.5
NPM包的類(lèi)型
支持TypeScript的編輯器

介紹

為了讓程序有價(jià)值,我們需要能夠處理最簡(jiǎn)單的數(shù)據(jù)單元:數(shù)字,字符串,結(jié)構(gòu)體,布爾值等。 TypeScript支持與JavaScript幾乎相同的數(shù)據(jù)類(lèi)型,此外還提供了實(shí)用的枚舉類(lèi)型方便我們使用。

布爾值

最基本的數(shù)據(jù)類(lèi)型就是簡(jiǎn)單的true/false值,在JavaScript和TypeScript里叫做boolean(其它語(yǔ)言中也一樣)。

let isDone: boolean = false;

數(shù)字

和JavaScript一樣,TypeScript里的所有數(shù)字都是浮點(diǎn)數(shù)。 這些浮點(diǎn)數(shù)的類(lèi)型是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)頁(yè)或服務(wù)器端的文本數(shù)據(jù)。 像其它語(yǔ)言里一樣,我們使用string表示文本數(shù)據(jù)類(lèi)型。 和JavaScript一樣,可以使用雙引號(hào)(")或單引號(hào)(')表示字符串。

let name: string = "bob";
name = "smith";

你還可以使用模版字符串,它可以定義多行文本和內(nèi)嵌表達(dá)式。 這種字符串是被反引號(hào)包圍(`),并且以${ 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.`;

這與下面定義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ù)組。 第一種,可以在元素類(lèi)型后面接上[],表示由此類(lèi)型元素組成的一個(gè)數(shù)組:

let list: number[] = [1, 2, 3];

第二種方式是使用數(shù)組泛型,Array<元素類(lèi)型>

let list: Array<number> = [1, 2, 3];

元組 Tuple

元組類(lèi)型允許表示一個(gè)已知元素?cái)?shù)量和類(lèi)型的數(shù)組,各元素的類(lèi)型不必相同。 比如,你可以定義一對(duì)值分別為stringnumber類(lèi)型的元組。

// Declare a tuple type
let x: [string, number];
// Initialize it
x = ['hello', 10]; // OK
// Initialize it incorrectly
x = [10, 'hello']; // Error

當(dāng)訪(fǎng)問(wèn)一個(gè)已知索引的元素,會(huì)得到正確的類(lèi)型:

console.log(x[0].substr(1)); // OK
console.log(x[1].substr(1)); // Error, 'number' does not have 'substr'

當(dāng)訪(fǎng)問(wèn)一個(gè)越界的元素,會(huì)使用聯(lián)合類(lèi)型替代:

x[3] = 'world'; // OK, 字符串可以賦值給(string | number)類(lèi)型

console.log(x[5].toString()); // OK, 'string' 和 'number' 都有 toString

x[6] = true; // Error, 布爾不是(string | number)類(lèi)型

聯(lián)合類(lèi)型是高級(jí)主題,我們會(huì)在以后的章節(jié)里討論它。

枚舉

enum類(lèi)型是對(duì)JavaScript標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型的一個(gè)補(bǔ)充。 像C#等其它語(yǔ)言一樣,使用枚舉類(lèi)型可以為一組數(shù)值賦予友好的名字。

enum Color {Red, Green, Blue};
let c: Color = Color.Green;

默認(rèn)情況下,從0開(kāi)始為元素編號(hào)。 你也可以手動(dòng)的指定成員的數(shù)值。 例如,我們將上面的例子改成從1開(kāi)始編號(hào):

enum Color {Red = 1, Green, Blue};
let c: Color = Color.Green;

或者,全部都采用手動(dòng)賦值:

enum Color {Red = 1, Green = 2, Blue = 4};
let c: Color = Color.Green;

枚舉類(lèi)型提供的一個(gè)便利是你可以由枚舉的值得到它的名字。 例如,我們知道數(shù)值為2,但是不確定它映射到Color里的哪個(gè)名字,我們可以查找相應(yīng)的名字:

enum Color {Red = 1, Green, Blue};
let colorName: string = Color[2];

alert(colorName);

任意值

有時(shí)候,我們會(huì)想要為那些在編程階段還不清楚類(lèi)型的變量指定一個(gè)類(lèi)型。 這些值可能來(lái)自于動(dòng)態(tài)的內(nèi)容,比如來(lái)自用戶(hù)輸入或第三方代碼庫(kù)。 這種情況下,我們不希望類(lèi)型檢查器對(duì)這些值進(jìn)行檢查而是直接讓它們通過(guò)編譯階段的檢查。 那么我們可以使用any類(lèi)型來(lái)標(biāo)記這些變量:

let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean

在對(duì)現(xiàn)有代碼進(jìn)行改寫(xiě)的時(shí)候,any類(lèi)型是十分有用的,它允許你在編譯時(shí)可選擇地包含或移除類(lèi)型檢查。 你可能認(rèn)為Object有相似的作用,就像它在其它語(yǔ)言中那樣。 但是Object類(lèi)型的變量只是允許你給它賦任意值 -- 但是卻不能夠在它上面調(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ù)的類(lèi)型時(shí),any類(lèi)型也是有用的。 比如,你有一個(gè)數(shù)組,它包含了不同的類(lèi)型的數(shù)據(jù):

let list: any[] = [1, true, "free"];

list[1] = 100;

空值

某種程度上來(lái)說(shuō),void類(lèi)型像是與any類(lèi)型相反,它表示沒(méi)有任何類(lèi)型。 當(dāng)一個(gè)函數(shù)沒(méi)有返回值時(shí),你通常會(huì)見(jiàn)到其返回值類(lèi)型是void

function warnUser(): void {
    alert("This is my warning message");
}

聲明一個(gè)void類(lèi)型的變量沒(méi)有什么大用,因?yàn)槟阒荒転樗x予undefinednull

let unusable: void = undefined;

類(lèi)型斷言

有時(shí)候你會(huì)遇到這樣的情況,你會(huì)比TypeScript更了解某個(gè)值的詳細(xì)信息。 通常這會(huì)發(fā)生在你清楚地知道一個(gè)實(shí)體具有比它現(xiàn)有類(lèi)型更確切的類(lèi)型。

通過(guò)類(lèi)型斷言這種方式可以告訴編譯器,“相信我,我知道自己在干什么”。 類(lèi)型斷言好比其它語(yǔ)言里的類(lèi)型轉(zhuǎn)換,但是不進(jìn)行特殊的數(shù)據(jù)檢查和解構(gòu)。 它沒(méi)有運(yùn)行時(shí)的影響,只是在編譯階段起作用。 TypeScript會(huì)假設(shè)你,程序員,已經(jīng)進(jìn)行了必須的檢查。

類(lèi)型斷言有兩種形式。 其一是“尖括號(hào)”語(yǔ)法:

let someValue: any = "this is a string";

let strLength: number = (<string>someValue).length;

另一個(gè)為as語(yǔ)法:

let someValue: any = "this is a string";

let strLength: number = (someValue as string).length;

兩種形式是等價(jià)的。 至于使用哪個(gè)大多數(shù)情況下是憑個(gè)人喜好;然而,當(dāng)你在TypeScript里使用JSX時(shí),只有as語(yǔ)法斷言是被允許地。

關(guān)于let

你可能已經(jīng)注意到了,我們使用let關(guān)鍵字來(lái)代替大家所熟悉的JavaScript關(guān)鍵字var。 let關(guān)鍵字是JavaScript的一個(gè)新概念,TypeScript實(shí)現(xiàn)了它。 我們會(huì)在以后詳細(xì)介紹它,很多常見(jiàn)的問(wèn)題都可以通過(guò)使用let來(lái)解決,所以盡可能地使用let來(lái)代替var吧。

上一篇:TypeScript 1.5下一篇:編碼規(guī)范