【问题标题】:Typescript optional chaining with check on the last argument带有检查最后一个参数的 Typescript 可选链接
【发布时间】:2021-06-07 03:23:06
【问题描述】:

我有一个如下所示的 if 语句:

if ("arg3" in arg1.arg2 && customFunction(arg1.arg2.arg3)) {}

现在任何参数都可以是未定义的,所以我想使用可选链接:

if ("arg3" in arg1?.arg2? && customFunction(arg1.arg2.arg3)) {}

这里的问题是我无法检查 arg2arg2?.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
}

提交表单时,我会检查任何字段是否为空或 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 的回答解决了我的问题,即如何使用无效合并检查可选链的最后一个参数。

【问题讨论】:

  • 运营商是.?,不能只有问号,在链尾没有意义。如果定义了 arg1 但没有 arg2 属性,您期望得到什么?你想要吗? arg1?.arg2 || default?
  • 你能举一个更具体的例子来说明预期的结果吗?似乎arg1?.arg2?.arg3 != null && customFunction(arg1.arg2.arg3) 应该可以工作,但我不能确定。 Playground Link
  • @VLAZ - 是的,知道arg1.arg2.arg3 的类型会很有用。
  • 我已经编辑了我的问题。我希望我的情况变得更清楚一点。如果还不清楚,请告诉我。
  • if ("uncPath" in process?.input && isEmpty(process.input.uncPath)) {}seems to work

标签: typescript optional-chaining


【解决方案1】:

正如您所说,仅使用 ? 即可启动条件运算符。¹可选的链接运算符是 ?.. 不是,呃,可选)。

这个条件还有一个问题,就是如果arg1为nullish,arg?.arg2的结果就是undefined,你就不能在undefined上使用in

您可以使用无效合并:

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 唯一的三元运算符,但这可能会改变。 :-)

【讨论】:

  • 感谢您的回答并消除了我对三元运算符 != 条件运算符的误解。现在完全有道理了,哈哈。我已经解决了这个问题。
  • @SeanA.S.Mengis - 哦,我认为“误解”是一种强有力的表达方式。 :-D 大多数人称其为“三元运算符”。但我喜欢在力所能及的地方纠正它……快乐的编码!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-06
  • 2017-11-24
  • 2012-09-27
  • 2018-10-21
  • 2018-04-13
  • 2021-01-22
相关资源
最近更新 更多