Typescript可选链接,在最后一个参数上使用check



我有一个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除了undefinednull之外不会有假值时,这才是可靠的。


¹条件运算符(?:)是a三元操作符(接受三个操作数的操作符,就像二进制操作符接受两个操作数,一元操作符接受一个操作数一样),目前它是JavaScript唯一的三元操作符,但这可能会改变。: -)

相关内容

  • 没有找到相关文章

最新更新