这是一个非常好的问题!
在 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!
更安全、更清晰。