代码之家  ›  专栏  ›  技术社区  ›  POV

多参数JS中的Reduce函数?

  •  -2
  • POV  · 技术社区  · 6 年前

    public _controlValid(form: FormGroup, fieldName: string[], enableFieldName: string) {
        if (fieldName.map(field => {
          return form.controls[field].valid;
        }).reduce(function (a: number, b: number) {
          return a * b;
        })) {
          form.controls[enableFieldName].enable();
        } else {
          form.controls[enableFieldName].disable();
        }
      }
    

    这段代码迭代字符串数组并尝试获取每个控件的状态。那么 reduce map .

    error TS2345: Argument of type '(a: number, b: number) => number' is not assignable to parameter of type '(previousVal
    ue: boolean, currentValue: boolean, currentIndex: number, array: boolean[]) => boolean'.
      Types of parameters 'a' and 'previousValue' are incompatible.
        Type 'boolean' is not assignable to type 'number'.
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Scott Sauyet    6 年前

    我假设您要做的是强制布尔值为0或1,将它们相乘以确定是否有零,然后强制结果数返回到布尔值以用于 if

    Typescript不喜欢这个主意。虽然它可能在原始Javascript中工作,但Typescript说不行。

    你可以通过替换你的 reduce 用电话 every 在布尔函数上:

    function _controlValid(form: FormGroup, fieldName: string[], enableFieldName: string) {
      if (fieldName.map(field => {
        return form.controls[field].valid;
      }).every((a: boolean) => a)) {
        form.controls[enableFieldName].enable();
      } else {
        form.controls[enableFieldName].disable();
      }
    }
    

    identity (x) => x ),然后你就可以写了 .every(identity) 更清楚。

    但是这个代码还是有点困扰着我。那个 情况真的很难看。我可能会分解两个助手函数来清理它:

    const allTrue = (xs) => xs.every(x => x);
    const fieldsValid = (controls, names) => names.map(n => controls[n].valid)
    
    function _controlValid(form: FormGroup, fieldName: string[], enableFieldName: string) {
      if (allTrue(fieldsValid(form.controls, fieldName))) {
        form.controls[enableFieldName].enable();
      } else {
        form.controls[enableFieldName].disable();
      }
    }