1. 類型斷言
類型斷言好比其它語(yǔ)言里的類型轉(zhuǎn)換庶艾,但是不進(jìn)行特殊的數(shù)據(jù)檢查和解構(gòu),它沒(méi)有運(yùn)行時(shí)的影響落竹,只是在編譯階段起作用,TypeScript
會(huì)假設(shè)程序員已經(jīng)檢查過(guò)
類型斷言有兩種方式:
1.1 尖括號(hào)寫法
let someValue: any = "this is a string";
// 如果寫的是any找長(zhǎng)短的時(shí)候編譯器是找不到length屬性的,類型斷言后就可以找到
let strLength: number = (<string>someValue).length;
1.2 as
寫法
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
兩種形式是等價(jià)的朱转,但是當(dāng)在
TypeScript
里使用JSX
語(yǔ)法時(shí)积暖,只有as
語(yǔ)法斷言是被允許的
2. 類型推論
TypeScript
里藤为,在有些沒(méi)有明確指出類型的地方夺刑,類型推論會(huì)幫助提供類型
let x = 3;
// 變量x的類型被推斷為數(shù)字.這種推斷發(fā)生在初始化變量和成員,設(shè)置默認(rèn)參數(shù)值和決定函數(shù)返回值時(shí)
2.1 最佳通用類型
當(dāng)需要從幾個(gè)表達(dá)式中推斷類型時(shí)候,會(huì)使用這些表達(dá)式的類型來(lái)推斷出一個(gè)最合適的通用類型
let x = [0, 1, null]; // 這時(shí)x被推斷為(null | number)[]
由于最終的通用類型取自候選類型存淫,有些時(shí)候候選類型
共享相同的通用類型,但是卻沒(méi)有一個(gè)類型能做為所有候選類型的類型
class Animal {}
class Rhino extends Animal {}
class Elephant extends Animal {}
class Snake extends Animal {}
let zoo = [new Rhino(), new Elephant(), new Snake()];
// 被推斷為(Rhino | Elephant | Snake)[]類型
// 我們想讓zoo被推斷為Animal[]類型,但是這個(gè)數(shù)組里沒(méi)有對(duì)象是Animal類型的,因此不能推斷出這個(gè)結(jié)果
// 為了更正,需要明確指定類型
let zoo: Animal[] = [new Rhino(), new Elephant(), new Snake()];
2.2 上下文類型
TypeScript
類型推論也可能按照相反的方向進(jìn)行桅咆。 這被叫做“按上下文歸類”坞笙。按上下文歸類會(huì)發(fā)生在表達(dá)式的類型與所處的位置相關(guān)時(shí)
window.onmousedown = function (mouseEvent) { // 這個(gè)例子會(huì)報(bào)錯(cuò)
console.log(mouseEvent.button); // -> Error
};
/*
TypeScript類型檢查器使用window.onmousedown函數(shù)的類型來(lái)推斷右邊函數(shù)表達(dá)式的類型。 因此,就能推斷出mouseEvent參數(shù)的類型了薛夜。如果函數(shù)表達(dá)式不是在上下文類型的位置,mouseEvent參數(shù)的類型需要指定為any,這樣就不會(huì)報(bào)錯(cuò)了
*/
window.onmousedown = function (mouseEvent: any) { // 手動(dòng)指定了參數(shù)類型上下文類型就會(huì)被忽略
console.log(mouseEvent.button); // <- Now, no error is given
};
上下文歸類會(huì)在很多情況下使用到。通常包含函數(shù)的參數(shù)寞冯,賦值表達(dá)式的右邊,類型斷言简十、對(duì)象成員和數(shù)組字面量和返回值語(yǔ)句。 上下文類型也會(huì)做為最佳通用類型的候選類型
function createZoo(): Animal[] { // 在這里面Animal就是被作為最佳通用類型
return [new Rhino(), new Elephant(), new Snake()];
}