TypeScript?類型斷言的幾種實(shí)現(xiàn)
本節(jié)介紹類型斷言,有使用關(guān)鍵字 as 和標(biāo)簽 <> 兩種方式,因后者會(huì)與JSX 語(yǔ)法沖突,建議統(tǒng)一使用 as 來(lái)進(jìn)行類型斷言。
1. 解釋
TypeScript 允許你覆蓋它的推斷,畢竟作為開發(fā)者你比編譯器更了解你寫的代碼。
類型斷言主要用于當(dāng) TypeScript 推斷出來(lái)類型并不滿足你的需求,你需要手動(dòng)指定一個(gè)類型。
2. 關(guān)鍵字 as
當(dāng)你把 JavaScript 代碼遷移到 TypeScript 時(shí),一個(gè)常見的問(wèn)題:
const user = {}
user.nickname = 'Evan' // Error, Property 'nickname' does not exist on type '{}'
user.admin = true // Error, Property 'admin' does not exist on type '{}'
代碼解釋: 編譯器推斷 const user: {},這是一個(gè)沒(méi)有屬性的對(duì)象,所以你不能對(duì)其添加屬性。
此時(shí)可以使用類型斷言(as關(guān)鍵字)覆蓋其類型推斷:
interface User {
nickname: string,
admin: boolean,
groups: number[]
}
const user = {} as User
user.nickname = 'Evan'
user.admin = true
user.groups = [2, 6]
代碼解釋:
第 7 行,這里通過(guò) as 關(guān)鍵字進(jìn)行類型斷言,將變量 user 的類型覆蓋為 User 類型。但是請(qǐng)注意,類型斷言不要濫用,除非你完全明白你在干什么。
3. 首尾標(biāo)簽
類型斷言還可以通過(guò)標(biāo)簽 <> 來(lái)實(shí)現(xiàn):
interface User {
nickname: string,
admin: boolean,
groups: number[]
}
const user = <User>{} // User類型
user.nickname = 'Evan'
user.admin = true
user.groups = [2, 6]
代碼解釋:
第 7 行,使用 <User>{} 這種標(biāo)簽形式,將變量 user 強(qiáng)制斷言為 User 類型。
但是,當(dāng)你在使用 JSX 語(yǔ)法時(shí),會(huì)跟標(biāo)簽 <> 形式的類型斷言混淆:
let nickname = <User>Evan</User> // 這里的 User 指向一個(gè) component
所以,建議統(tǒng)一使用 as type 這種語(yǔ)法來(lái)為類型斷言。
4. 非空斷言 !
如果編譯器不能夠去除 null 或 undefined,可以使用非空斷言 ! 手動(dòng)去除。
function fixed(name: string | null): string {
function postfix(epithet: string) {
return name!.charAt(0) + '. the ' + epithet; // name 被斷言為非空
}
name = name || "Bob"
return postfix("great")
}
代碼解釋:
第 2 行,postfix() 是一個(gè)嵌套函數(shù),因?yàn)榫幾g器無(wú)法去除嵌套函數(shù)的 null (除非是立即調(diào)用的函數(shù)表達(dá)式),所以 TypeScript 推斷第 3 行的 name 可能為空。
第 5 行,而 name = name || "Bob" 這行代碼已經(jīng)明確了 name 不為空,所以可以直接給 name 斷言為非空(第 3 行)。
5. 雙重?cái)嘌?/h2>
雙重?cái)嘌詷O少有應(yīng)用場(chǎng)景,只需要知道有這種操作即可:
interface User {
nickname: string,
admin: boolean,
group: number[]
}
const user = 'Evan' as any as User
代碼解釋: 最后一行,使用 as 關(guān)鍵字進(jìn)行了兩次斷言,最終變量 user 被強(qiáng)制轉(zhuǎn)化為 User 類型。
6. 小結(jié)
本節(jié)介紹了幾種類型斷言的方法,需要注意:
- 慎用類型斷言,除非你真的有把握。
- 類型斷言是一個(gè)編譯時(shí)語(yǔ)法,不涉及運(yùn)行時(shí)。
到此這篇關(guān)于TypeScript 類型斷言的幾種實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)TypeScript 類型斷言內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js入門之Function函數(shù)的使用方法【新手必看】
本篇文章主要介紹js Function函數(shù)的使用方法,應(yīng)該對(duì)初學(xué)Js的朋友們會(huì)有所幫助,下面就隨小編一起來(lái)看下吧2016-11-11
JAVASCRIPT代碼編寫俄羅斯方塊網(wǎng)頁(yè)版
俄羅斯方塊方塊是小時(shí)候的一個(gè)回憶,從最開始的掌上的黑白游戲機(jī),到電視游戲機(jī),到電腦,無(wú)不有它的痕跡,今天我們來(lái)一起重溫它的一種實(shí)現(xiàn)方法,也算是整理一下我的思路吧,感興趣的小伙伴一起學(xué)習(xí)吧2015-11-11
JS遍歷JSON數(shù)組及獲取JSON數(shù)組長(zhǎng)度操作示例【測(cè)試可用】
這篇文章主要介紹了JS遍歷JSON數(shù)組及獲取JSON數(shù)組長(zhǎng)度操作,涉及javascript簡(jiǎn)單json數(shù)組遍歷與運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2018-12-12
uniapp跨頁(yè)面?zhèn)鲄⒌膸追N方式小結(jié)
當(dāng)我們?cè)陂_發(fā)Uni-app應(yīng)用時(shí),經(jīng)常會(huì)遇到需要在不同頁(yè)面之間傳遞參數(shù)的情況,為了實(shí)現(xiàn)跨頁(yè)面?zhèn)鲄?Uni-app提供了幾種方式,所以本文小編將給大家介紹一下uniapp跨頁(yè)面?zhèn)鲄⒌膸追N方式,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-01-01
基于Arcgis for javascript實(shí)現(xiàn)百度地圖ABCD marker的效果
本篇文章由腳本之家小編給大家分享的基于Arcgis for javascript實(shí)現(xiàn)百度地圖ABCD marker的效果,需要的朋友一起學(xué)習(xí)吧2015-09-09

