TypeScript語法詳解之類型操作的補(bǔ)充
類型操作的補(bǔ)充
類型斷言的使用
有時(shí)候TypeScript無法獲取具體的類型信息,這個(gè)我們需要使用類型斷言( Type Assertions)。
比如我們在操作DOM的時(shí)候, 通過 document.getElementById 獲取元素, TypeScript只知道該函數(shù)會(huì)返回HTMLElement ,但并不知道它具體的類型, 是無法得知具體是img還是div等等:
當(dāng)我們加上類型斷言后, TypeScript就可以得知具體的類型信息
const el = document.getElementById("app") as HTMLImageElement el.src = "圖片地址"
TypeScript只允許類型斷言轉(zhuǎn)換為 更具體 或者 不太具體(指的是any和unknown)的類型版本,此規(guī)則可防止不可能的強(qiáng)制轉(zhuǎn)換:
如下直接轉(zhuǎn)是會(huì)報(bào)錯(cuò)的
我們可以先將message轉(zhuǎn)為any或者unknown, 再轉(zhuǎn)為number, 但是不推薦這樣做
const message = "Hello World" const num: number = (message as any) as number
非空類型的斷言
當(dāng)我們編寫下面的代碼時(shí),在執(zhí)行ts的編譯階段會(huì)報(bào)錯(cuò):
這是因?yàn)閭魅氲膍essage有可能是為undefined的,這個(gè)時(shí)候是不能執(zhí)行方法的;
// 參數(shù)為可選類型的時(shí)候 function printMessage(message?: string) { console.log(message.toUpperCase()) } printMessage("aaa")
我們確定上面代碼傳入的參數(shù)是有值的, 但是編譯還是不通過,這個(gè)時(shí)候我們可以使用非空類型斷言:
非空斷言使用的是
!
,表示可以確定某個(gè)標(biāo)識符是有值的,跳過ts在編譯階段對它的檢測, 雖然逃過了編譯階段的檢查, 但是代碼依然是不嚴(yán)謹(jǐn)?shù)模?/p>
function printMessage(message?: string) { // 加上 ! 代表著保證這個(gè)message一定是有值的 console.log(message!.toUpperCase()) } printMessage("aaa")
可選鏈?zhǔn)褂媒榻B
可選鏈?zhǔn)聦?shí)上并不是TypeScript獨(dú)有的特性,它是ES11( ES2020)
中增加的特性:
可選鏈?zhǔn)褂每蛇x鏈操作符 ?.;
它的作用是當(dāng)對象的屬性不存在時(shí),會(huì)短路表達(dá)式后面就不會(huì)執(zhí)行,直接返回undefined,如果存在,那么才會(huì)繼續(xù)執(zhí)行;
雖然可選鏈操作是ECMAScript提出的特性,但是和TypeScript一起使用更版本;
例如我們定義如下一個(gè)對象
type Person = { name: string friend?: { name: string age?: number } } const info: Person = { name: "chenyq" }
當(dāng)我們在其他地方獲取對象的屬性時(shí), 意味著name屬性是一定可以獲取到的, 而friend屬性有可能是獲取不到的
console.log(info.name) // 表示friend有值的情況下再取name或者age, 沒有值就是undefined, 代碼不會(huì)報(bào)錯(cuò) console.log(info.friend?.name) console.log(info.friend?.age)
兩個(gè)特殊操作符
有時(shí)候我們還會(huì)看到 !! 和 ?? 操作符
,這些都是做什么的呢?
!! 和 ?? 操作符, 這本身也是JavaScript的特性, 并不是TypeScript的語法
!!操作符:
將一個(gè)其他類型轉(zhuǎn)換成boolean類型;
類似于Boolean(變量)的方式;
例如我們想要將message轉(zhuǎn)為boolean類型再賦值給flag, 我們有兩種方式
const message = "Hello World" // 方式一: 通過Boolean(變量)的方式 let flag1 = Boolean(message) console.log(flag1) // true // 方式二: 通過 !! 操作符 let flag2 = !!message console.log(flag2)
??操作符:
它是ES11增加的新特性;
空值合并操作符( ??)是一個(gè)邏輯操作符,當(dāng)操作符的左側(cè)是 null 或者 undefined 時(shí),返回其右側(cè)操作數(shù), 否則返回左側(cè)操作數(shù);
let message: string|null = null // 當(dāng)message沒有值時(shí), 將??操作符右邊的默認(rèn)值賦值給content // 當(dāng)message有值時(shí), 將message的值賦值給content const content = message ?? "我是默認(rèn)值" console.log(content) // 我是默認(rèn)值
字面量類型介紹
除了前面我們所講過的類型之外,也可以使用字面量類型( literal types):
字面量類型必須和它的值是保持一致的
// "Hello World"是可以作為類型的, 這個(gè)就叫字面量類型 let message: "Hello World" = "Hello World" let num: 123 = 123 // 不能是其他的值 // message = "Hello"
那么這樣做有什么意義呢?
默認(rèn)情況下這么做是確實(shí)是沒有意義的;
但是我們可以讓多個(gè)字面量類型 結(jié)合 聯(lián)合類型在一起, 就有了意義
// 例如我們用一個(gè)變量來保存對齊方式 let align: "left" | "right" | "center" = "left" align = "right" align = "center"
字面量推理介紹
我們來看下面的代碼:
由于我們的對象再進(jìn)行字面量推理的時(shí)候,options其實(shí)是一個(gè) {url: string, method: string},而request的methods是字面量類型Method, 所以我們沒辦法將 一個(gè) string 類型的值賦值給一個(gè)字面量類型, 因此編譯階段就會(huì)報(bào)錯(cuò)。
方式一: 當(dāng)我們確定options對象的method沒有寫錯(cuò)的話, 我們可以使用類型斷言(將寬泛的類型轉(zhuǎn)為具體的類型), 如下:
// 使用類型斷言 request(options.url, options.methods as Method)
方式二: 看起來有點(diǎn)奇怪, 但是是官方文檔中提到的, 給對象添加as const
const options = { url: "http://aaa.org", methods: "POST" } as const
總結(jié)
到此這篇關(guān)于TypeScript語法詳解之類型操作補(bǔ)充的文章就介紹到這了,更多相關(guān)TypeScript類型操作的補(bǔ)充內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用JavaScript 判斷用戶使用的是 IE6 還是 IE7
判斷IE瀏覽器的腳本,方便根據(jù)瀏覽器不懂,支持不同的代碼的分別調(diào)用。2008-01-01微信小程序開發(fā)之實(shí)現(xiàn)別踩白塊游戲
這篇文章主要為大家詳細(xì)介紹了如何通過微信小程序開發(fā)一個(gè)簡單的別踩白塊游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以和小編一起學(xué)習(xí)一下2023-02-02微信小程序自定義tabbar欄實(shí)現(xiàn)過程講解
tabBar相對而言用的還是比較多的,但是用起來并沒有難,下面這篇文章主要給大家介紹了關(guān)于微信小程序全局配置之tabBar的相關(guān)資料,文中通過圖文以及示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02微信小程序倒計(jì)時(shí)功能實(shí)現(xiàn)代碼
倒計(jì)時(shí)功能在項(xiàng)目開發(fā)中經(jīng)常會(huì)用到,今天小編給大家介紹下微信小程序倒計(jì)時(shí)功能實(shí)現(xiàn)代碼,需要的朋友參考下吧2017-11-11JavaScript對象的創(chuàng)建模式與繼承模式示例講解
繼承機(jī)制是面向?qū)ο蟪绦蛟O(shè)計(jì)使代碼可以復(fù)用的最重要的手段,它允許程序員在保持原有的特性基礎(chǔ)上進(jìn)行擴(kuò)展,增加功能,這樣產(chǎn)生新的類,稱作是派生類。繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)的層析結(jié)構(gòu),體現(xiàn)了由簡單到復(fù)雜的認(rèn)知過程。繼承是類設(shè)計(jì)層次的復(fù)用2022-12-12