有没有办法让第二个函数使用第一个:语法

is there a way to make the second function use the first one: syntax

export const composeValidators = (...validators) => value => validators.reduce((error, validator) => error || validator(value), undefined);

export const composeAccreditionValidators = (... validators) => value => validators.reduce((error, validator) => validator(value) === undefined ? error : `! ${validator(value)}`, undefined);

我正在尝试专门为我的一个组件创建第二个函数,并且希望让第二个函数调用第一个函数。从句法上讲,我可能犯了一些错误,因此代码在我身上爆炸了。有人可以帮忙吗?

注意:我想保持第二个的逻辑完整。本质上它将输出字符串包装在一个! space 与第一个不同。


编辑:这里写的是相同的函数,所以更容易阅读。

function composeValidators(...validators) {
  return function (value) {
    return validators.reduce((error, validator) => (
      error || validator(value)
    ), undefined)
  }
}

function composeAccreditionValidators(...validators) {
  return function (value) {
    return validators.reduce((error, validator) => (
      validator(value) === undefined
        ? error
        : `! ${validator(value)}`
      ), undefined);
  }
}

您可以编写一个包含这两个函数的函数,并将柯里化 reducer 函数作为输入:

const createComposeValidators = reducer => (...validators) => value =>
  validators.reduce(reducer(value), undefined)

export const composeValidators = createComposeValidators(
  value => (error, validator) =>
    error || validator(value)
)

export const composeAccreditionValidators = createComposeValidators(
  value => (error, validator) =>
    validator(value) === undefined ? error : `! ${validator(value)}`
)

下面是相同的函数,因此更容易阅读:

function createComposeValidators(reducer) {
  return function composeValidators(...validators) {
    return function (value) {
      return validators.reduce(reducer(value), undefined)
    }
  }
}

另一种选择是在 composeAccreditionValidators 函数中使用 composeValidators 函数:

function composeValidators(...validators) {
  return function (value) {
    return validators.reduce((error, validator) => (
      error || validator(value)
    ), undefined)
  }
}

function composeAccreditionValidators(...validators) {
  const validate = composeValidators(...validators);
  return function (value) {
    const error = validate(value);
    return error && `! ${error}`;
  }
}