Ramda - allPass returns 为真,即使其中一个条件为假

Ramda - allPass returns true, even if one of the conditions is false

我正在使用 Ramda 来清理我的代码。我需要做一些复杂的检查。我决定使用 ramda 中的 allPassanyPass 而不是 &&||

但是我有一个问题。 AllPass,即使其中一个条件为假,也会 return true,而常规 && returns 为假。

第一个检查是错误的,第二个是正确的。然而,这种奇怪的事情正在发生。

// Regulr &&, returns false
  const emptyView =
    R.contains(itemType, [IItemType.ONE, IItemType.TWO]) &&
    R.equals(mode, IViewMode.VIEW);

// Ramda allPass returns true
  const emptyView = R.allPass([
    R.contains(itemType, [IItemType.JSON, IItemType.AVRO]),
    R.equals(mode, IViewMode.VIEW),
  ]);

有人可以向我解释为什么吗?我尝试了 Ramda 的两种变体。一个普通的数组,还调用函数,提供必要的信息,但没有运气。我做错了什么?

虽然第一个 emptyView 实际上是布尔类型, 第二个只是一个函数(在 javascript 中总是求值为真)。

我认为以下是您真正需要的, 一个可以告诉您 itemTypemode 是否正确的函数。

const IItemType = {
  JSON: 1,
  AVRO: 2
};

const IViewMode = {
 VIEW: 'view',
};

const fn = R.useWith(R.and, [
  R.contains(R.__, [IItemType.JSON, IItemType.AVRO]),
  R.equals(IViewMode.VIEW),
]);

console.log(
  'it should be true =>', 
  fn(1, 'view'),
);

console.log(
  'it should be false =>', 
  fn(1, 'something-but-view'),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js" integrity="sha512-3sdB9mAxNh2MIo6YkY05uY1qjkywAlDfCf5u1cSotv6k9CZUSyHVf4BJSpTYgla+YHLaHG8LUpqV7MHctlYzlw==" crossorigin="anonymous"></script>