我有一个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或Email类型。
界面看起来是这样的:
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
}
提交表单时,我检查是否有任何字段为空或null。当像这样检查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的回答解决了我的问题,即如何检查具有null合并的可选链的最后一个参数。
正如您所说,仅使用?
开始条件运算符。¹可选的链操作符是?.
(.
不是可选的)。
这个条件还有另一个问题,如果arg1
为空,arg?.arg2
的结果是undefined
,并且你不能在undefined
上使用in
。
你可以使用null合并:
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唯一的三元操作符,但这可能会改变。: -)