TypeScript 中感叹号(!)两种位置用法

这是一个非常好的问题!

在 TypeScript 中,感叹号(!)有两种位置用法,它们含义完全不同:


✅ 一、后置感叹号 !(非空断言)

process.env.ADMIN_PRIVATE_KEY!

✅ 作用:

告诉 TypeScript:

“我开发者保证这个值不会是 undefinednull,你别报错。”

🔧 用途:

用于绕过 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! 更安全、更清晰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/82930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

t014-项目申报管理系统 【springBoot 含源码】

项目演示视频 摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,项目信息因为其管理内容繁杂,管理数量繁多导致手工进行…

【C++】STL详解(四)---Stack和Queue

文章目录 Stack定义方式使用方式 Queue定义方式使用方式 Stack Stack是一种容器&#xff0c;是基本的数据结构之一&#xff0c;特点是先进后出。 定义方式 方式一&#xff1a;普通定义方式 stack<int> st1;方式二&#xff1a; stack<int,vector<int>> …

解决 xmlsec.InternalError: (-1, ‘lxml xmlsec libxml2 library version mismatch‘)

解决 xmlsec.InternalError: (-1, ‘lxml & xmlsec libxml2 library version mismatch’) 错误信息如下&#xff1a; Traceback (most recent call last):File "/home/mobsf/Mobile-Security-Framework-MobSF/manage.py", line 18, in <module>execute_f…

SpringBoot自定义实体类字段的校验注解

在Spring Boot项目中&#xff0c;我们经常需要对请求参数进行格式或业务规则的校验。虽然Spring Boot提供了如NotNull、Size等基础校验注解&#xff0c;但在实际开发中往往无法满足复杂的业务需求。但是在Controller层写大量的 if 语句的判断逻辑又实在不优雅&#xff0c;好在 …

实现单例模式的6种方法(Python)

目录 一. 基于模块的实现(简单&#xff0c;易用) 二. 重新创建时报错(不好用) 三. 只靠方法获取实例(不好用) 四. 类装饰器 五. 重写__new__方法 六. 元类 七. 总结 单例模式&#xff08;Singleton Pattern&#xff09;是一种设计模式&#xff0c;其核心目标是确保一个类…

循环神经网络(RNN)全面教程:从原理到实践

循环神经网络(RNN)全面教程&#xff1a;从原理到实践 引言 循环神经网络(Recurrent Neural Network, RNN)是处理序列数据的经典神经网络架构&#xff0c;在自然语言处理、语音识别、时间序列预测等领域有着广泛应用。本文将系统介绍RNN的核心概念、常见变体、实现方法以及实际…

使用Vditor将Markdown文档渲染成网页(Vite+JS+Vditor)

1. 引言 编写Markdown文档现在可以说是程序员的必备技能了&#xff0c;因为Markdown很好地实现了内容与排版分离&#xff0c;可以让程序员更专注于内容的创作。现在很多技术文档&#xff0c;博客发布甚至AI文字输出的内容都是以Markdown格式的形式输出的。那么&#xff0c;Mar…

Day 40

单通道图片的规范写法 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader , Dataset from torchvision import datasets, transforms import matplotlib.pyplot as plt import warnings warnings.filterwarnings(&q…

SPSS跨域分类:自监督知识+软模板优化

1. 图1:SPSS方法流程图 作用:展示了SPSS方法的整体流程,从数据预处理到模型预测的关键步骤。核心内容: 领域知识提取:使用三种词性标注工具(NLTK、spaCy、TextBlob)从源域和目标域提取名词或形容词(如例句中提取“excellent”“good”等形容词)。词汇交集与聚类:对提…

2025年通用 Linux 服务器操作系统该如何选择?

2025年通用 Linux 服务器操作系统该如何选择&#xff1f; 服务器操作系统的选择对一个企业IT和云服务影响很大&#xff0c;主推的操作系统在后期更换的成本很高&#xff0c;而且也有很大的迁移风险&#xff0c;所以企业在选择服务器操作系统时要尤为重视。 之前最流行的服务器…

如何在 Django 中集成 MCP Server

目录 背景说明第一步&#xff1a;使用 ASGI第二步&#xff1a;修改 asgi.py 中的应用第三步&#xff1a;Django 数据的异步查询 背景说明 有几个原因导致 Django 集成 MCP Server 比较麻烦 目前支持的 MCP 服务是 SSE 协议的&#xff0c;需要长连接&#xff0c;但一般来讲 Dj…

天拓四方工业互联网平台赋能:地铁电力配电室综合监控与无人巡检,实现效益与影响的双重显著提升

随着城市化进程的不断加快&#xff0c;城市轨道交通作为缓解交通压力、提升出行效率的重要方式&#xff0c;在全国各大城市中得到了迅猛发展。地铁电力配电室作为核心供电设施&#xff0c;其基础设施的安全性、稳定性和智能化水平也面临更高要求。 本文将围绕“工业物联网平台…

算法打卡第11天

36.有效的括号 &#xff08;力扣20题&#xff09; 示例 1&#xff1a; **输入&#xff1a;**s “()” **输出&#xff1a;**true 示例 2&#xff1a; **输入&#xff1a;**s “()[]{}” **输出&#xff1a;**true 示例 3&#xff1a; **输入&#xff1a;**s “(]”…

python 包管理工具uv

uv --version uv python find uv python list export UV_DEFAULT_INDEX"https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" # 换成私有的repo export UV_HTTP_TIMEOUT120 uv python install 3.12 uv venv myenv --python 3.12 --seed uvhttps://docs.ast…

spring的多语言怎么实现?

1.创建springboot项目&#xff0c;并配置application.properties文件 spring.messages.basenamemessages spring.messages.encodingUTF-8 spring.messages.fallback-to-system-localefalsespring.thymeleaf.cachefalse spring.thymeleaf.prefixclasspath:/templates/ spring.t…

JAVA:Kafka 消息可靠性详解与实践样例

🧱 1、简述 Apache Kafka 是高吞吐、可扩展的流处理平台,在分布式架构中广泛应用于日志采集、事件驱动和微服务解耦场景。但在使用过程中,消息是否会丢?何时丢?如何防止丢? 是很多开发者关心的问题。 Kafka 提供了一套完整的机制来保障消息从生产者 ➜ Broker ➜ 消费…

【AI非常道】二零二五年五月,AI非常道

经常在社区看到一些非常有启发或者有收获的话语&#xff0c;但是&#xff0c;往往看过就成为过眼云烟&#xff0c;有时再想去找又找不到。索性&#xff0c;今年开始&#xff0c;看到好的言语&#xff0c;就记录下来&#xff0c;一月一发布&#xff0c;亦供大家参考。 前面的记…

C++哈希

一.哈希概念 哈希又叫做散列。本质就是通过哈希函数把关键字key和存储位置建立映射关系&#xff0c;查找时通过这个哈希函数计算出key存储的位置&#xff0c;进行快速查找。 上述概念可能不那么好懂&#xff0c;下面的例子可以辅助我们理解。 无论是数组还是链表&#xff0c;查…

iOS 使用CocoaPods 添加Alamofire 提示错误的问题

Sandbox: rsync(59817) deny(1) file-write-create /Users/aaa/Library/Developer/Xcode/DerivedData/myApp-bpwnzikesjzmbadkbokxllvexrrl/Build/Products/Debug-iphoneos/myApp.app/Frameworks/Alamofire.framework/Alamofire.bundle把这个改成 no 2 设置配置文件

mysql的Memory引擎的深入了解

目录 1、Memory引擎介绍 2、Memory内存结构 3、内存表的锁 4、持久化 5、优缺点 6、应用 前言 Memory 存储引擎 是 MySQL 中一种高性能但非持久化的存储方案&#xff0c;适合临时数据存储和缓存场景。其核心优势在于极快的读写速度&#xff0c;需注意数据丢失风险和内存占…