TypeScript基礎(chǔ)(一) 類型基礎(chǔ)

介紹

為了讓程序有價(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ù)組

TypeScriptJavaScript一樣可以操作數(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吧奕锌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末著觉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惊暴,更是在濱河造成了極大的恐慌饼丘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辽话,死亡現(xiàn)場離奇詭異肄鸽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)油啤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門典徘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人村砂,你說我怎么就攤上這事烂斋。” “怎么了础废?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長罕模。 經(jīng)常有香客問我评腺,道長,這世上最難降的妖魔是什么淑掌? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任蒿讥,我火速辦了婚禮,結(jié)果婚禮上抛腕,老公的妹妹穿的比我還像新娘芋绸。我一直安慰自己,他們只是感情好担敌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布摔敛。 她就那樣靜靜地躺著,像睡著了一般全封。 火紅的嫁衣襯著肌膚如雪马昙。 梳的紋絲不亂的頭發(fā)上桃犬,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音行楞,去河邊找鬼攒暇。 笑死,一個胖子當(dāng)著我的面吹牛子房,可吹牛的內(nèi)容都是我干的形用。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼证杭,長吁一口氣:“原來是場噩夢啊……” “哼尾序!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起躯砰,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤每币,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后琢歇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兰怠,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年李茫,在試婚紗的時候發(fā)現(xiàn)自己被綠了揭保。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡魄宏,死狀恐怖秸侣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宠互,我是刑警寧澤味榛,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站予跌,受9級特大地震影響搏色,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜券册,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一频轿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧烁焙,春花似錦航邢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乞榨,卻和暖如春秽之,著一層夾襖步出監(jiān)牢的瞬間当娱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工考榨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跨细,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓河质,卻偏偏與公主長得像冀惭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掀鹅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理散休,服務(wù)發(fā)現(xiàn),斷路器乐尊,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 你怎么不問我為啥把頭發(fā)剪了 問了我也不知道哈哈哈哈哈 你怎么不問我相親怎么樣 想讓我自己說嗎 怎么不問我剛剛?cè)ツ膬?..
    ShAvIn閱讀 219評論 0 0
  • 人生天地間戚丸, 起與始,從來孑然一身扔嵌。 內(nèi)心的孤獨(dú)限府, 源自靈魂深處。 友誼痢缎,愛情胁勺, 孤獨(dú)的調(diào)味而, 滴滴墨汁独旷,豈能圖...
    暮雨瀟瀟兮閱讀 195評論 0 0
  • 我能量沒有流動署穗、有種如鯁在喉的感覺、身體也很僵硬嵌洼!我在和很多感覺抗?fàn)幇钙#〔唤蛹{自己在乎的感受!頭腦里全是方法策略和用...
    lawyer麗閱讀 150評論 0 0