【问题标题】:How to do non short circuit condition in Typescript?如何在 Typescript 中进行非短路条件?
【发布时间】:2016-09-21 09:28:26
【问题描述】:

如何在打字稿中以非短路方式评估条件? Typescript 不允许将 &| 用于布尔类型。 我需要非短路检查的原因是我在函数isValueValid 中调用了showErrors。

鉴于此功能

function isValue1Valid(){
  if(value1 === 0) return true;    
  showErrors1();
  return false;
}

function isValue2Valid(){
  if(value2 === 0) return true;    
  showErrors2();
  return false;
}

那么在我的情况下

if(isValue2Valid() & isValue2Valid()){
//Submit data
}

虽然我可以这样做

if(isValue2Valid() & isValue2Valid()){
//Submit data 
   return;
}
showErrors1()
showErrors2()

但我觉得在 isValueValid 函数中调用它。实际上,我总是想在出现错误时默认调用显示错误。

【问题讨论】:

  • 为了避免“XY 问题”:您为什么不想短路? (我怀疑你依赖于副作用......如果是这样的话,从条件表达式中提取那些。)
  • 听起来确实是一个 XY 问题。当我开始着手编程时,我认为自己会很聪明,并且做了类似if (process(otherStuff) && valid(stuff)) 这样的事情,却发现如果我交换条件它就行不通了。
  • 我在 valid1() & valid2() 内部调用了一些函数。
  • @janmvtrinidad 你可以按照@Richard 的建议去做,基本上是var valid1 = isValue1Valid(); valid2 = isValue2Valid(); if (valid1 && valid2) 尽管将验证逻辑与错误显示分离可能会更好,所以它看起来像if (isValid()) { /* do stuff */ } else { /* display errors */ }
  • 我想我会重构让验证函数返回一个消息列表。如果列表为空,则验证通过。所以你最终得到:var msgs = validation1(); msgs.concat(validation2()); if (msgs.length === 0) { return;}.

标签: javascript typescript evaluation-strategy


【解决方案1】:

要回答你的问题,你可以这样做

if ([isValue2Valid(), isValue2Valid()].every(Boolean)) {
    //Submit data
}

评估所有函数调用,然后组合它们的值。但是你真的不应该首先让isValueValid 打电话给showError。相反,请将您的测试函数 return 设置为错误消息,然后如果有,请显示它们:

function getValue1Error() {
    if (value1 === 0) return null;
    else return "error1";
}

function getValue2Error() {
    if (value2 === 0) return null; 
    else return "error2";
}

// then:
const errors = [getValue1Error(), getValue2Error()] // or even better, just a loop over your fields
if (errors.some(Boolean)) {
    for (let error of errors)
        showError(error);
} else {
    // Submit data
}

【讨论】:

  • 我在你的最后一部分代码中结束了它。谢谢@Bergi
【解决方案2】:

如果您想使用具有副作用的函数(这通常不是一个好主意),那么明确说明调用的内容和时间可能会有所帮助:

   var value1Valid = isValue1Valid(); // might show some messages
   var value2Valid = isValue2Valid(); // might show some more messages

   if (value1Valid && value2Valid) {
        // submit data
   }

【讨论】:

    猜你喜欢
    • 2021-10-07
    • 2020-11-02
    • 2018-05-12
    • 1970-01-01
    • 2013-08-23
    • 2015-10-15
    • 2020-11-21
    • 2012-04-27
    • 1970-01-01
    相关资源
    最近更新 更多