這是一個非常好的問題!
在 TypeScript 中,感嘆號(!
)有兩種位置用法,它們含義完全不同:
? 一、后置感嘆號 !
(非空斷言)
process.env.ADMIN_PRIVATE_KEY!
? 作用:
告訴 TypeScript:
“我開發者保證這個值不會是
undefined
或null
,你別報錯。”
🔧 用途:
用于繞過 process.env.X
可能是 undefined
的類型報錯(常見于 .env
變量)。
?? 風險:
如果運行時確實是 undefined
,程序會拋出運行時錯誤。
? 二、前置感嘆號 !
(邏輯“非”運算符)
!process.env.ADMIN_PRIVATE_KEY
? 作用:
這是 JavaScript 的邏輯“非”操作,代表布爾取反。
它會將表達式轉換為布爾值并取反:
if (!process.env.ADMIN_PRIVATE_KEY) { throw new Error('缺少私鑰'); }
這意味著:
-
如果
process.env.ADMIN_PRIVATE_KEY
是 falsy(如undefined
,''
,null
),就會拋出錯誤; -
常用于手動校驗環境變量是否存在。
? 總結對比
寫法 | 用途 | 含義 | 場景 |
---|---|---|---|
process.env.ADMIN_PRIVATE_KEY! | 非空斷言 | "我保證這個一定有值" | 繞過 TypeScript 報錯 |
!process.env.ADMIN_PRIVATE_KEY | 布爾取反 | "如果這個沒值就執行" | 判斷值是否存在 |
💡 建議用法
最好先用 !xxx
判斷,再使用 xxx!
非空斷言:
const key = process.env.ADMIN_PRIVATE_KEY;
if (!key) {throw new Error('Missing ADMIN_PRIVATE_KEY');
}
this.admin = new ethers.Wallet(key); // key現在TypeScript自動識別為string
這種方式比盲目用 process.env.ADMIN_PRIVATE_KEY!
更安全、更清晰。