亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在打字稿中,什么是!解除引用會員時(感嘆號/爆炸)運營商?

在打字稿中,什么是!解除引用會員時(感嘆號/爆炸)運營商?

溫溫醬 2019-07-23 19:19:58
在打字稿中,什么是!解除引用會員時(感嘆號/爆炸)運營商?在查看tslint規則的源代碼時,我遇到了以下語句:if (node.parent!.kind === ts.SyntaxKind.ObjectLiteralExpression) {     return;}注意!操作員之后node.parent。有趣!我首先嘗試使用我當前安裝的TS版本(1.5.3)在本地編譯該文件。結果錯誤指向爆炸的確切位置:$ tsc --noImplicitAny memberAccessRule.ts  noPublicModifierRule.ts(57,24): error TS1005: ')' expected.接下來我升級到最新的TS(2.1.6),編譯它沒有問題。所以它似乎是TS 2.x的特征。但是,轉化完全忽略了爆炸,導致以下JS:if (node.parent.kind === ts.SyntaxKind.ObjectLiteralExpression) {     return;}我的Google fu到目前為止都沒有讓我失望。什么是TS的感嘆號操作符,它是如何工作的?
查看完整描述

3 回答

?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

那是非空斷言運算符。這是一種告訴編譯器“這個表達式不能nullundefined在這里,所以不要抱怨它null或它的可能性undefined”的方法。有時類型檢查器本身無法做出決定。

這里解釋如下:

可以使用新的!post-fix表達式運算符來斷言其操作數在類型檢查器無法推斷該事實的上下文中是非空且非未定義的。具體而言,該操作x!產生x具有nullundefined排除的類型的值。類似鍵入的形式斷言<T>xx as T,所述!非空斷言操作者簡單地在所發射的JavaScript代碼移除。

我發現在這個解釋中使用“斷言”一詞有點誤導。它是“斷言”的,即開發人員斷言它,而不是在將要執行測試的意義上。最后一行確實表明它不會發出任何JavaScript代碼。


查看完整回答
反對 回復 2019-07-23
?
largeQ

TA貢獻2039條經驗 獲得超8個贊

路易斯的答案很棒,但我想我會試著簡潔地總結一下:

bang運算符告訴編譯器暫時放松它可能需要的“非空”約束。它告訴編譯器:“作為開發人員,我比你更了解這個變量現在不能為null”。


查看完整回答
反對 回復 2019-07-23
?
慕田峪4524236

TA貢獻1875條經驗 獲得超5個贊

作為一個激勵性的例子:使用新的ES Map類型和dict.has(key) ? dict.get(key) : 'default';TS編譯器之類的代碼不能推斷出get調用永遠不會返回null / undefined。dict.has(key) ? dict.get(key)! : 'default';正確縮小類型。

查看完整回答
反對 回復 2019-07-23
  • 3 回答
  • 0 關注
  • 580 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號