TypeScript - 類型系統(tǒng)

TypeScript - 類型系統(tǒng)

[TOC]

學(xué)習(xí)目標(biāo)

  • 了解類型系統(tǒng)
    • 類型標(biāo)注
    • 類型檢測(cè)的好處
    • 使用場(chǎng)景
  • 掌握常用的類型標(biāo)注的使用

類型系統(tǒng)

簡(jiǎn)單來說類型系統(tǒng)包含:

  • 類型標(biāo)注(簽名)
  • 類型檢測(cè)

類型標(biāo)注

類型標(biāo)注就是給數(shù)據(jù)(變量碑定、函數(shù)袍啡、類等)添加類型說明

類型標(biāo)注語(yǔ)法:

變量: 標(biāo)注類型

let 變量: 數(shù)據(jù)類型;

類型檢測(cè)

有了類型標(biāo)注鼓拧,編譯器會(huì)在編譯過程中根據(jù)標(biāo)注的類型進(jìn)行檢測(cè)析砸,使數(shù)據(jù)的使用更安全代虾,幫助我們減少錯(cuò)誤

同時(shí)配合 編輯器/IDE 栈戳,類型標(biāo)注還能提供更加強(qiáng)大和友好的智能提示

<span style="color:red">注意:類型系統(tǒng)檢測(cè)的是類型安聘,而不是具體值华糖,即 數(shù)據(jù)是否與標(biāo)注的類型一致</span>

標(biāo)注類型有哪些麦向?

  • 基礎(chǔ)類型
  • 空和未定義類型
  • 對(duì)象類型
  • 數(shù)組類型
  • 元組類型
  • 枚舉類型
  • 無(wú)值類型
  • Never類型
  • 任意類型
  • 未知類型(Version3.0 Added)

基礎(chǔ)類型

基礎(chǔ)類型包含:string,number客叉,boolean

標(biāo)注語(yǔ)法

變量: string;
變量: number;
變量: boolean;
let title: string = '開課吧';
let n: number = 100;
let isOk: boolean = true;

title = 100;    //錯(cuò)誤

空和未定義類型

因?yàn)樵?Null 和 Undefined 這兩種類型有且只有一個(gè)值诵竭,在標(biāo)注一個(gè)變量為 Null 和 Undefined 類型,那就表示該變量不能修改了

默認(rèn)情況下 null 和 undefined 是所有類型的子類型兼搏。 就是說你可以把 null 和 undefined 其它類型的變量

如果一個(gè)變量聲明了卵慰,但是未賦值,那么該變量的值為 undefined佛呻,但是如果它同時(shí)也沒有標(biāo)注類型的話裳朋,默認(rèn)類型為 any,any 類型后面有詳細(xì)說明

let un: undefined;
un = 1; // 錯(cuò)誤
let nul: null;
nul = 1; //錯(cuò)誤
let a: string = '開課吧';
a = null; // 可以
a = undefined; // 可以

小技巧:指定 strictNullChecks 配置為 true吓著,可以有效的檢測(cè) null 值數(shù)據(jù)鲤嫡,避免很多常見問題送挑,建議對(duì)可能出現(xiàn)的 null 和 undefined 進(jìn)行容錯(cuò)處理,使程序更加嚴(yán)謹(jǐn)

let ele = document.querySelector('#box');
if (ele) {
      ele.style.display = 'none';
}

對(duì)象類型

Object 類型表示非原始值類型

標(biāo)注語(yǔ)法

變量: object

基于對(duì)象字面量的類型標(biāo)注

let ot: {x: number, y: string} = {
    x: 1,
    y: 'zmouse'
};

針對(duì)對(duì)象這種特殊而有復(fù)雜的數(shù)據(jù)暖眼,TypeScript 有許多的方式來進(jìn)行類型標(biāo)注

內(nèi)置對(duì)象類型

除了 Object 類型惕耕,在 JavaScript 中還有很多的內(nèi)置對(duì)象,如:Date罢荡,標(biāo)注如下:

變量: 內(nèi)置對(duì)象構(gòu)造函數(shù)名
let d1: Date = new Date();
let set1: Set = new Set();

包裝對(duì)象

這里說的包裝對(duì)象其實(shí)就是 JavaScript 中的 String赡突、Number、Boolean区赵,我們知道 string 類型 和 String 類型并不一樣惭缰,在 TypeScript 中也是一樣

let a: string;
a = '1';
a = new String('1');    // 錯(cuò)誤

let b: String;
b = new String('2');
b = '2';    // 正確

數(shù)組類型

TypeScript 中的數(shù)組存儲(chǔ)的類型必須一致,所以在標(biāo)注數(shù)組類型的時(shí)候笼才,同時(shí)要標(biāo)注數(shù)組中存儲(chǔ)的數(shù)據(jù)類型

標(biāo)注語(yǔ)法

變量: 類型[]

數(shù)組還有另外一種基于 泛型 的標(biāo)注

變量: Array<類型>

let arr1: string[] = [];
arr1.push('開課吧'); // 正確
arr1.push(1); // 錯(cuò)誤

let arr2: Array<number> = [];
arr2.push(100); // 正確
arr2.push('開課吧'); // 錯(cuò)誤

元組類型

元組類似數(shù)組漱受,但是存儲(chǔ)的元素類型不必相同,但是需要注意:

  • 初始化數(shù)據(jù)的個(gè)數(shù)以及對(duì)應(yīng)位置標(biāo)注類型必須一致
  • 越界數(shù)據(jù)必須是元組標(biāo)注中的類型之一(標(biāo)注越界數(shù)據(jù)可以不用對(duì)應(yīng)順序 - 聯(lián)合類型)

標(biāo)注語(yǔ)法

變量: [類型一, 類型二,...]
let data1: [string, number] = ['開課吧', 100];
data1.push(100); // 正確
data1.push('100'); // 正確
data1.push(true); // 錯(cuò)誤

注意:未開啟 strictNullChecks: true 會(huì)使用 undefined 進(jìn)行初始化

枚舉類型

枚舉的作用組織收集一組關(guān)聯(lián)數(shù)據(jù)的方式

標(biāo)注語(yǔ)法

enum 枚舉名稱 { key1=value, key2=value2 }
  • key 不能是數(shù)字
  • value 可以是數(shù)字骡送,稱為 數(shù)字類型枚舉昂羡,也可以是字符串,稱為 字符串類型枚舉摔踱,但不能是其它值虐先,默認(rèn)為數(shù)字:0
  • 第一個(gè)枚舉值或者前一個(gè)枚舉值為數(shù)字時(shí),可以省略賦值派敷,其值為 前一個(gè)數(shù)字值 + 1

數(shù)字類型枚舉

enum HTTP_CODE {
    OK = 200,
    NOT_FOUND = 404
};
HTTP_CODE.OK    //200

字符串類型枚舉

enum URLS  {
    USER_REGISETER = '/user/register',
    USER_LOGIN = '/user/login'
}

無(wú)值類型

表示沒有任何數(shù)據(jù)的類型蛹批,通常用于標(biāo)注無(wú)返回值函數(shù)的返回值類型,函數(shù)默認(rèn)標(biāo)注類型位:void

標(biāo)注語(yǔ)法

變量: void
function fn():void {
    // 沒有 return
}

Never類型

當(dāng)一個(gè)函數(shù)永遠(yuǎn)不可能執(zhí)行 return 的時(shí)候篮愉,返回的就是 never 腐芍,與 void 不同,void 是執(zhí)行了 return试躏, 只是沒有值猪勇,never 是不會(huì)執(zhí)行 return,比如拋出錯(cuò)誤颠蕴,導(dǎo)致函數(shù)終止執(zhí)行

function fn(): never {
    throw new Error('error');
}
  • never 類型是所有其它類型的子類
  • 其它不能賦值給 never 類型泣刹,即使是 any

任意類型

有的時(shí)候,我們并不確定這個(gè)值到底是什么類型或者不需要對(duì)該值進(jìn)行類型檢測(cè)犀被,就可以標(biāo)注為 any 類型

  • 任何值都可以賦值給 any 類型
  • any 類型也可以賦值給任意類型
  • any 類型有任意屬性和方法

標(biāo)注語(yǔ)法

變量: any

注意:標(biāo)注為 any 類型项玛,也意味著放棄對(duì)該值的類型檢測(cè),同時(shí)放棄 IDE 的智能提示

小技巧:指定 noImplicitAny 配置為 true弱判,當(dāng)函數(shù)參數(shù)出現(xiàn)隱含的 any 類型時(shí)報(bào)錯(cuò)

未知類型

unknow襟沮,3.0 版本中新增,屬于安全版的 any,但是與 any 不同的是:

  • unknow 僅能賦值給 unknow开伏、any
  • unknow 沒有任何屬性和方法

標(biāo)注語(yǔ)法

變量: unknow;

函數(shù)類型

在 JavaScript 中函數(shù)是一等公民的存在膀跌,在 TypeScript 也是如此,同樣的固灵,函數(shù)也有自己的類型標(biāo)注格式

函數(shù)名稱( 參數(shù)1: 類型, 參數(shù)2: 類型... ): 返回值類型;
function add(x: number, y: number): number {
    return x + y;
}

總結(jié)

  • 類型標(biāo)注語(yǔ)法
  • 基礎(chǔ)類型標(biāo)注
    • 字符串捅伤、數(shù)字、布爾值巫玻、空丛忆、未定義
  • 非基礎(chǔ)類型標(biāo)注
    • 對(duì)象、數(shù)組
  • 特殊類型
    • 元組仍秤、枚舉熄诡、無(wú)值類型、Never類型诗力、任意類型凰浮、未知類型
  • 包裝對(duì)象
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市苇本,隨后出現(xiàn)的幾起案子袜茧,更是在濱河造成了極大的恐慌,老刑警劉巖瓣窄,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笛厦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡俺夕,警方通過查閱死者的電腦和手機(jī)裳凸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啥么,“玉大人登舞,你說我怎么就攤上這事贰逾⌒伲” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵疙剑,是天一觀的道長(zhǎng)氯迂。 經(jīng)常有香客問我,道長(zhǎng)言缤,這世上最難降的妖魔是什么嚼蚀? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮管挟,結(jié)果婚禮上轿曙,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好导帝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布守谓。 她就那樣靜靜地躺著,像睡著了一般您单。 火紅的嫁衣襯著肌膚如雪斋荞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天虐秦,我揣著相機(jī)與錄音平酿,去河邊找鬼。 笑死悦陋,一個(gè)胖子當(dāng)著我的面吹牛蜈彼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叨恨,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼柳刮,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了痒钝?” 一聲冷哼從身側(cè)響起秉颗,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎送矩,沒想到半個(gè)月后蚕甥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡栋荸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年菇怀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晌块。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爱沟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匆背,到底是詐尸還是另有隱情呼伸,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布钝尸,位于F島的核電站括享,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏珍促。R本人自食惡果不足惜铃辖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猪叙。 院中可真熱鬧娇斩,春花似錦仁卷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瓶殃,卻和暖如春充包,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遥椿。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工基矮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冠场。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓家浇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親碴裙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钢悲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354