问题描述
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,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)) {}
现在 T.J. Crowders 的回答解决了我的问题,即如何使用无效合并检查可选链的最后一个参数。
解决方法
如您所说,仅使用 ?
就可以启动条件运算符。¹ 可选链运算符是 ?.
(.
不是,呃,可选)。
该条件还有另一个问题,即如果 arg1
为空,则 arg?.arg2
的结果是 undefined
,并且您不能在 in
上使用 undefined
{1}}。
您可以使用无效合并:
if ("arg3" in (arg1?.arg2 ?? {}) && customFunction(arg1.arg2.arg3)) {}
但我想我宁愿做你的问题,因为它更早地短路了:
if (arg1?.arg2 && "arg3" in arg1.arg2 && customFunction(arg1.arg2.arg3)) {}
但只有当我们知道(大概是从类型信息)arg1.arg2
不会有除 undefined
或 null
之外的假值时,这才是可靠的。
¹ 条件运算符 (?:
) 是 a 三元运算符(一个运算符接受三个操作数,就像二元运算符接受两个而一元运算符接受一个一样),目前它是JavaScript 唯一的三元运算符,但这可能会改变。 :-)