TypeScript學(xué)習(xí)筆記之類(lèi)型縮小
類(lèi)型縮小
什么是類(lèi)型縮小呢?
類(lèi)型縮小的英文是 Type Narrowing;
我們可以通過(guò)類(lèi)似于 typeof padding === "number" 的判斷語(yǔ)句,來(lái)改變TypeScript的執(zhí)行路徑;
在給定的執(zhí)行路徑中,我們可以縮小比聲明時(shí)更小的類(lèi)型,這個(gè)過(guò)程稱(chēng)之為縮小;
而我們編寫(xiě)的 typeof padding === "number 語(yǔ)句可以稱(chēng)之為 類(lèi)型保護(hù)( type guards);
常見(jiàn)的類(lèi)型保護(hù)有如下幾種:
- typeof
- 平等縮?。ū热?==、 !==)
- instanceof
- in
- 等等…
我們主要講解typeof、平等縮小、instanceof、in這四種
typeof
在TypeScript中,檢查返回的值typeof是一種類(lèi)型保護(hù):因?yàn)門(mén)ypeScript對(duì)如何typeof操作不同的值進(jìn)行編碼。
例如我們有下面一個(gè)常見(jiàn), 封裝一個(gè)函數(shù), 函數(shù)要求傳入?yún)?shù)ID, 傳入的ID有可能是string類(lèi)型有可能是number類(lèi)型
當(dāng)傳入的ID是string類(lèi)型時(shí), 要求將ID的字母全部轉(zhuǎn)為大寫(xiě)
function printID(id: string|number) {
if (typeof id === "string") {
console.log(id.toUpperCase())
} else {
console.log(id)
}
}
// 測(cè)試
printID(123)
printID("aaa")
- 上面代碼中, 整個(gè)if判斷語(yǔ)句就是類(lèi)型縮小, 例如當(dāng)代碼進(jìn)入if語(yǔ)句第一個(gè)分支時(shí), 一定是string類(lèi)型, 進(jìn)入第二個(gè)分支一定是number類(lèi)型
- if的判斷語(yǔ)句就稱(chēng)為類(lèi)型保護(hù)
平等縮小
我們可以使用Switch或者相等的一些運(yùn)算符來(lái)表達(dá)相等性(比如=== , !== , == , and != ):
type Direction = "left" | "right" | "top" | "bottom"
function printDirection(direction: Direction) {
// 平等類(lèi)型縮小
switch (direction) {
case "left":
console.log(direction)
break
case "right":
console.log(direction)
break
case "top":
console.log(direction)
break
case "bottom":
console.log(direction)
break
default:
console.log("調(diào)用默認(rèn)方法")
}
}
// 測(cè)試
printDirection("left")
printDirection("right")
printDirection("top")
printDirection("bottom")
instanceof
JavaScript 有一個(gè)運(yùn)算符來(lái)檢查一個(gè)值是否是另一個(gè)值的“實(shí)例”:
function printTime(time: string|Date) {
// 判斷time是否是Date的實(shí)例
if (time instanceof Date) {
console.log(time.toUTCString())
} else {
console.log(time)
}
}
// 測(cè)試
printTime("2020-01-02")
const date = new Date()
printTime(date)
如果不好理解我們可以看下面這個(gè)例子
class Teacher {
working() {
console.log("正在工作")
}
}
class Student {
studying() {
console.log("正在學(xué)習(xí)")
}
}
function work(p: Student | Teacher) {
// 判斷是哪一個(gè)實(shí)例
if (p instanceof Teacher) {
p.working()
} else {
p.studying()
}
}
// 測(cè)試
const stu = new Student()
const tec = new Teacher()
work(stu) // 正在學(xué)習(xí)
work(tec) // 正在工作
in
Javascript 有一個(gè)運(yùn)算符,用于確定對(duì)象是否具有帶名稱(chēng)的屬性: in運(yùn)算符
如果指定的屬性在指定的對(duì)象或其原型鏈中,則in 運(yùn)算符返回true;
// () => void表示是一個(gè)函數(shù)類(lèi)型
type Dog = {running: () => void}
type Fish = {swimming: () => void}
function walk(animal: Dog|Fish) {
// 判斷函數(shù)是否在animal中
if ("swimming" in animal) {
animal.swimming()
} else {
animal.running()
}
}
// 測(cè)試
const dog: Dog = {
running() {
console.log("狗是跑的")
}
}
const fish: Fish = {
swimming() {
console.log("魚(yú)是游的")
}
}
walk(dog) // 狗是跑的
walk(fish) // 魚(yú)是游的
總結(jié)
到此這篇關(guān)于TypeScript類(lèi)型縮小的文章就介紹到這了,更多相關(guān)TypeScript類(lèi)型縮小內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS動(dòng)態(tài)添加選項(xiàng)案例分析
這篇文章主要介紹了JS動(dòng)態(tài)添加選項(xiàng)的方法,結(jié)合實(shí)例形式分析了javascript針對(duì)頁(yè)面元素動(dòng)態(tài)操作的相關(guān)技巧,需要的朋友可以參考下2016-10-10
Raphael帶文本標(biāo)簽可拖動(dòng)的圖形實(shí)現(xiàn)代碼
Javascript和Raphael順便學(xué)習(xí)了一下,主要是為了實(shí)現(xiàn)一個(gè)可拖動(dòng)的矩形同時(shí)矩形上還得顯示標(biāo)簽,網(wǎng)上關(guān)于這方面的知識(shí)提的很是于是本人自不量力寫(xiě)了一下,感興趣的你可不要錯(cuò)過(guò)了哈,希望可以幫助到你2013-02-02
js替換字符串中所有指定的字符(實(shí)現(xiàn)代碼)
下面小編就為大家?guī)?lái)一篇js替換字符串中所有指定的字符(實(shí)現(xiàn)代碼)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
基于JavaScript實(shí)現(xiàn)帶數(shù)據(jù)驗(yàn)證和復(fù)選框的表單提交
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)帶數(shù)據(jù)驗(yàn)證和復(fù)選框的表單提交功能,需要的朋友可以參考下2017-08-08
怎么選擇Javascript框架(Javascript Framework)
如果你正面臨這樣的問(wèn)題,希望下面的幾個(gè)建議對(duì)你在選擇javascript框架上會(huì)有所幫助2013-11-11
Axios取消重復(fù)請(qǐng)求的方法實(shí)例詳解
在開(kāi)發(fā)中,經(jīng)常會(huì)遇到接口重復(fù)請(qǐng)求導(dǎo)致的各種問(wèn)題,這篇文章主要給大家介紹了關(guān)于Axios取消重復(fù)請(qǐng)求的相關(guān)資料,需要的朋友可以參考下2021-06-06
js貪心算法 錢(qián)幣找零問(wèn)題代碼實(shí)例
這篇文章主要介紹了js貪心算法 錢(qián)幣找零問(wèn)題代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09

