【TypeScript】類型斷言(五)
文章來源:http://www.zghlxwxcb.cn/news/detail-644976.html
一、簡介
TypeScript
斷言是指在編寫代碼時,開發(fā)者能夠告訴編譯器某個值的具體類型,從而可以在編譯階段強(qiáng)制類型檢查。
這其實在某些強(qiáng)類型語言中,類似于強(qiáng)制類型轉(zhuǎn)換的操作。
類型斷言有兩種形式實現(xiàn):
- 尖括號語法
- as語法
二、斷言形式
2.1 尖括號語法
尖括號語法:開發(fā)者可以使用 <類型>
的方式指定某個值的類型,例如:
注意: 有些小伙伴在演練場使用的時候,會提示錯誤信息,是因為JSX語法沖突,可以在編輯器中通過創(chuàng)建 tsx
或 ts
文件來練習(xí)。
let sayHi: any = "hello world";
let hiLength1: number = (<string>sayHi).length;
let hiLength2: number = (<number>sayHi).length; // error
sayHi是any
類型,在使用時候?qū)⑵鋽嘌詾?string 類型,則不會有錯誤提示。然后當(dāng)我們斷言為 number ,則會有錯誤警告。
繼續(xù)執(zhí)行接下來的操作。
let sayHi:string | number = 'good good';
let hiLength:number = (<string>sayHi).length; //0
sayHi是string或者number的聯(lián)合類型,在使用時候?qū)⑵鋽嘌詾閟tring類型。
2.2 as形式
as類型斷言語法: 值a as 類型A
的語法進(jìn)行類型斷言,將 值a
斷言為 類型A
.
例如:
let sayHi: string | number = 'good good';
let hiLength1: number = (sayHi as string).length;
let hiLength2: number = (sayHi as number).length; // error
對于sayHi同樣的進(jìn)行斷言為string和number,結(jié)果和尖括號語法斷言一致。
使用斷言的優(yōu)勢是可以在編譯階段捕獲一些潛在的類型錯誤,從而提高代碼的可靠性。不過需要注意,過度使用斷言會導(dǎo)致代碼的可讀性和可維護(hù)性降低,因此需要謹(jǐn)慎使用。
as形式
的斷言在實際開發(fā)中比較推薦。
三、其他斷言類型
3.1 非空斷言
TypeScript還有一個特殊的語法,用于在不進(jìn)行任何顯式檢查的情況下從類型中刪除 null
和undefined
。使用 !
寫在需要斷言的表達(dá)式或者值之后:
function setName(name: string | null | undefined) : void {
if (name.length) {
console.log('name', name)
}
}
從編譯結(jié)果我們能夠看出,name可能為null或者undefined,我們進(jìn)行非空斷言處理,修改調(diào)用方式為 name!.length
function setName(name: string | null | undefined) : void {
if (name!.length) {
console.log('name', name)
}
}
現(xiàn)在,在編譯時就不會報錯了。但是還是需要注意,當(dāng)在運行時,真正的傳入了null
或者undefined
時,則會出現(xiàn)異常。請務(wù)必注意。
3.2 確定賦值斷言
在開發(fā)中還有這樣一種情況, 就是我們在初始定義某一個變量的時候, 有可能是不賦值的,在后面的代碼或者函數(shù)內(nèi)對其進(jìn)行賦值, 然后再使用。
TypeScript允許在實例屬性或者變量聲明后面放置 !
號,從而告訴 TypeScript 該屬性會被明確地賦值。
// 初始化的時候不進(jìn)行賦值
let n: number
// 通過調(diào)用這個函數(shù)對 n 進(jìn)行賦值操作
function init () { n = 100 }
init()
// 這里使用一下 n
console.log(n.toFixed(2))
為了避免編譯出錯,我們可以在變量名后面加個!
符號.
// 初始化的時候不進(jìn)行賦值
let n!: number
// 通過調(diào)用這個函數(shù)對 n 進(jìn)行賦值操作
function init () { n = 100 }
init()
// 這里使用一下 n
console.log(n.toFixed(2))
此時,再去執(zhí)行編譯,則不會出現(xiàn)定義前使用的錯誤提示了。
四、斷言使用需謹(jǐn)慎
需要注意的是,使用斷言雖然能避免編譯中的TypeScript的報錯,但是卻避免不了運行中實際真實的報錯,因此,除非你真的知道你在做什么,否則不需要輕易使用斷言。
如下面代碼:
type Score = number | string;
function updateScore(scoreValue:Score): string {
return (scoreValue as string).toUpperCase()
}
updateScore(1)
可以看到在編輯器中并沒有報錯,但熟悉代碼的效果伴一眼就能看看出這是有問題的代碼。
打開控制臺或編輯器運行這段代碼,顯示出錯
所以除非確切的知道變量的數(shù)據(jù)類型,否則不要輕易使用類型斷言,這是因為類型斷言會讓 TypeScript 編譯器
將變量當(dāng)做指定的類型,而不管它實際的類型,在程序?qū)嶋H運行時可能有JavaScript語法錯誤,因此使用斷言需要額外注意。
以上就是【TypeScript】類型斷言的總結(jié),如果對你有幫助,請不要吝嗇你的小手給我狠狠的點贊、關(guān)注加分享。文章來源地址http://www.zghlxwxcb.cn/news/detail-644976.html
到了這里,關(guān)于【TypeScript】類型斷言-類型的聲明和轉(zhuǎn)換(五)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!