TypeScript?類型斷言的幾種實(shí)現(xiàn)
本節(jié)介紹類型斷言,有使用關(guān)鍵字 as
和標(biāo)簽 <>
兩種方式,因后者會(huì)與JSX
語法沖突,建議統(tǒng)一使用 as
來進(jìn)行類型斷言。
1. 解釋
TypeScript 允許你覆蓋它的推斷,畢竟作為開發(fā)者你比編譯器更了解你寫的代碼。
類型斷言主要用于當(dāng) TypeScript 推斷出來類型并不滿足你的需求,你需要手動(dòng)指定一個(gè)類型。
2. 關(guān)鍵字 as
當(dāng)你把 JavaScript 代碼遷移到 TypeScript 時(shí),一個(gè)常見的問題:
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è)沒有屬性的對(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 行,這里通過 as
關(guān)鍵字進(jìn)行類型斷言,將變量 user
的類型覆蓋為 User
類型。但是請(qǐng)注意,類型斷言不要濫用,除非你完全明白你在干什么。
3. 首尾標(biāo)簽
類型斷言還可以通過標(biāo)簽 <>
來實(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
語法時(shí),會(huì)跟標(biāo)簽 <>
形式的類型斷言混淆:
let nickname = <User>Evan</User> // 這里的 User 指向一個(gè) component
所以,建議統(tǒng)一使用 as type
這種語法來為類型斷言。
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器無法去除嵌套函數(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)用場景,只需要知道有這種操作即可:
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ùn)行時(shí)。
到此這篇關(guān)于TypeScript 類型斷言的幾種實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)TypeScript 類型斷言內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
uniapp小程序使用高德地圖api實(shí)現(xiàn)路線規(guī)劃的示例代碼
路線規(guī)劃常用于出行路線的提前預(yù)覽,我們提供4種類型的路線規(guī)劃,分別為:駕車、步行、公交和騎行,滿足各種的出行場景,這篇文章主要介紹了uniapp小程序使用高德地圖api實(shí)現(xiàn)路線規(guī)劃,需要的朋友可以參考下2023-01-01ActiveX控件的使用-js實(shí)現(xiàn)打印超市小票功能代碼詳解
這篇文章主要介紹了ActiveX控件的使用-js實(shí)現(xiàn)打印超市小票功能代碼詳解,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11js getBoundingClientRect() 來獲取頁面元素的位置
該方法已經(jīng)不再是IE Only了,F(xiàn)F3.0+和Opera9.5+已經(jīng)支持了該方法,可以說在獲得頁面元素位置上效率能有很大的提高,在以前版本的Opera和Firefox中必須通過循環(huán)來獲得元素在頁面中的絕對(duì)位置。2010-11-11原生javaScript實(shí)現(xiàn)圖片延時(shí)加載的方法
這篇文章主要介紹了原生javaScript實(shí)現(xiàn)圖片延時(shí)加載的方法,無需通過載入jQuery腳本即可實(shí)現(xiàn)圖片的延時(shí)加載效果,是非常實(shí)用的技巧,需要的朋友可以參考下2014-12-12ES6新數(shù)據(jù)結(jié)構(gòu)Map功能與用法示例
這篇文章主要介紹了ES6新數(shù)據(jù)結(jié)構(gòu)Map功能與用法,結(jié)合實(shí)例形式分析了Map的功能、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-03-03JavaScript實(shí)現(xiàn)網(wǎng)頁留言板功能
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)網(wǎng)頁留言板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11JavaScript實(shí)現(xiàn)獲取年月日時(shí)間的方法總結(jié)
這篇文章主要為大家學(xué)習(xí)介紹了JavaScript如何實(shí)現(xiàn)獲取年月日以及各種格式的時(shí)間,文中的示例代碼簡潔易懂,感興趣的小伙伴可以了解一下2023-08-08