【问题标题】:Typescript array of function traversal questionTypescript数组的函数遍历问题
【发布时间】:2019-08-29 17:39:05
【问题描述】:

我的程序有一个检查许多条件的地方。

与编写大型 if(conditionOne || conditionTwo || ...) 类型的表达式相反,我决定定义一个过滤器数组,如下所示:

const filters: Array<(err: MyError) => boolean> = [
      (e: MyError) => e.checkSomething(),
      (e: MyError) => e.checkSomethingElse,
      (e: MyError) => e.checkSomethingYetAgain()
    ];

然后我像这样遍历它:

for (const key in filters) {
      if (filters[key](err)) {
        return true;
      }
    }
return false;

我觉得有一种更实用的方式来表达这一点(因为现在,在我看来,这看起来太必要了),但我不确定它看起来如何。 谢谢!

【问题讨论】:

  • “更好”怎么样?我们需要一种客观的方法来衡量答案,否则问题将被“主要基于意见”而结束。
  • 我正在寻找一种更实用的方式来表达这个想法,因为我所描述的方式看起来非常必要。
  • 例如,使用reduce是“更好”还是“更实用”?
  • 我会说使用reduce 对我来说确实很实用,但是,我不确定如何编写它,因为在我的函数数组上调用reduce 会返回一个函数,但是不是一个值。
  • 调用reduce会返回你希望它返回的任何东西,即你分配给累加器的东西。我鼓励你read the linked article in its entirety。

标签: arrays typescript function loops functional-programming


【解决方案1】:

也许find:

function makeErrorFilter(filters: Array<(err: MyError) => boolean>) {
  return (err: MyError) => !!filters.find(filter => filter(err));
}

const errorFilter = makeErrorFilter([
  (e: MyError) => e.checkSomething(),
  (e: MyError) => e.checkSomethingElse,
  (e: MyError) => e.checkSomethingYetAgain()
]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多