typescript - 带有检查最后一个参数的 Typescript 可选链接
问题描述
我有一个看起来像这样的 if 语句:
if ("arg3" in arg1.arg2 && customFunction(arg1.arg2.arg3)) {}
现在任何参数都可以未定义,所以我想使用可选链接:
if ("arg3" in arg1?.arg2? && customFunction(arg1.arg2.arg3)) {}
arg2
这里的问题是我无法检查arg2?.
或arg2?
因为 Typescript 需要额外的参数或认为我想使用条件运算符。所以我想知道是否让这个 if 语句起作用的唯一方法是:
if (arg1?.arg2 && "arg3" in arg1.arg2 && customFunction(arg1.arg2.arg3)) {}
我有几种情况,我尝试使用可选链接并需要检查最后一个参数。我对编程很陌生,所以如果有人可以告诉我如何正确编写它或者可以指向我解释为什么我不能或不应该将最后一个参数作为可选参数的文档,我会很高兴。
EDIT1:对于那些想知道 arg1、2 和 3 类型的人:在我的情况下,我有一个表格,您可以填写一个表格来为特定流程创建自动化。您有一般信息和输入和输出,可以是 SMB 或电子邮件类型。
界面看起来像这样:
process: {
processName: string,
description: string
input: smbInterface | emailInterface
output: smbInterface | emailInterface
}
smbInterface: {
username: string,
password: string,
uncPath: string
}
emailInterface: {
username: string,
password: string,
domain: string
}
提交表单时,我会检查任何字段是否为空或为空。当uncPath
像这样检查时,我得到一个错误“可能未定义”:
if (isEmpty(process.input.uncPath)) {}
所以我把它改成:
if ("uncPath" in process?.input && isEmpty(process.input.uncPath)) {}
仍然收到未定义的错误,所以我将其更改为:
if (process.input && "uncPath" in process.input && isEmpty(process.input.uncPath)) {}
这可行,但我想知道是否可以将其简化为以下内容:
if ("uncPath" in process?.input? && isEmpty(process.input.uncPath)) {}
显然,process?.input?
Typescript 认为我想使用条件运算符,所以我正在寻找另一种方式。
我希望这能澄清一点。对不起,如果我不清楚(也许仍然是)。
EDIT2:显然我更清楚的例子是缺少一些我目前不知道它是什么的东西。正如 VLAZ 在他的评论中指出的那样,它应该与:
if ("uncPath" in process?.input && isEmpty(process.input.uncPath)) {}
现在,TJ Crowders 的回答解决了我的问题,即如何检查具有无效合并的可选链的最后一个参数。
解决方案
正如您所说,?
您只需启动条件运算符。¹可选的链接运算符是?.
(.
不是,呃,可选)。
该条件还有另一个问题,即 ifarg1
为空,结果为arg?.arg2
is undefined
,您不能使用in
on undefined
。
您可以使用无效合并:
if ("arg3" in (arg1?.arg2 ?? {}) && customFunction(arg1.arg2.arg3)) {}
但我想我宁愿做你的问题,因为它更早短路:
if (arg1?.arg2 && "arg3" in arg1.arg2 && customFunction(arg1.arg2.arg3)) {}
但这只有在我们知道(可能来自类型信息)除了orarg1.arg2
之外没有虚假值的情况下才是可靠的。undefined
null
¹ 条件运算符 ( ?:
) 是一个三元运算符(一个运算符接受三个操作数,就像一个二元运算符接受两个而一元运算符接受一个),目前它是 JavaScript 唯一的三元运算符,但这可能会改变。:-)
推荐阅读
- angular - Angular 组件看不到同一文件中的接口
- c++ - 为什么 C++ 中 set::end 的迭代器取消对集合中元素数量的引用?
- python - 如何在内部使用多处理时通过 API 重新启动烧瓶服务器
- mysql - 计算一张表中的数据,其中表列 = 行号
- java - 如何使用 Docker-compose 在 Docker 上连接 Spring Boot 和 MySQL?
- angular - 向地图添加移动标记,带角度的 openlayers
- flutter - 如何从不同的页面抖动访问局部变量
- asp.net - 如何将不带 ssl 的 http 处理程序添加到我的 asp.net 安全 Web 应用程序?
- azure - JobHost 在运行 azure timer 功能应用程序时随机停止
- sql - 如何在 oracle 中使可空列不为空