3 回答

TA貢獻1824條經(jīng)驗 獲得超8個贊
那是非空斷言運算符。這是一種告訴編譯器“這個表達式不能null
或undefined
在這里,所以不要抱怨它null
或它的可能性undefined
”的方法。有時類型檢查器本身無法做出決定。
這里解釋如下:
可以使用新的
!
post-fix表達式運算符來斷言其操作數(shù)在類型檢查器無法推斷該事實的上下文中是非空且非未定義的。具體而言,該操作x!
產(chǎn)生x
具有null
和undefined
排除的類型的值。類似鍵入的形式斷言<T>x
和x as T
,所述!
非空斷言操作者簡單地在所發(fā)射的JavaScript代碼移除。
我發(fā)現(xiàn)在這個解釋中使用“斷言”一詞有點誤導。它是“斷言”的,即開發(fā)人員斷言它,而不是在將要執(zhí)行測試的意義上。最后一行確實表明它不會發(fā)出任何JavaScript代碼。

TA貢獻2039條經(jīng)驗 獲得超8個贊
路易斯的答案很棒,但我想我會試著簡潔地總結(jié)一下:
bang運算符告訴編譯器暫時放松它可能需要的“非空”約束。它告訴編譯器:“作為開發(fā)人員,我比你更了解這個變量現(xiàn)在不能為null”。

TA貢獻1875條經(jīng)驗 獲得超5個贊
作為一個激勵性的例子:使用新的ES Map類型和dict.has(key) ? dict.get(key) : 'default';
TS編譯器之類的代碼不能推斷出get
調(diào)用永遠不會返回null / undefined。dict.has(key) ? dict.get(key)! : 'default';
正確縮小類型。
添加回答
舉報