Logo
Section 1 / 3

if-else

在函数式管道中使用 ifElse(3分钟阅读)

导入

if-else

在函数式管道中使用 ifElse(3分钟阅读)

我们习惯于看到如下形式的 if 语句:

1const hasAccess = true; 2 3if (hasAccess) { 4 console.log('Access granted.'); 5} else { 6 console.log('Access denied.'); 7}

一种越来越受欢迎的替代方案是三元运算符。

1const hasAccess = true; 2const message = hasAccess ? 'Access granted.' : 'Access denied.'; 3 4console.log(message);

Ramda 提供了 ifElse,让你能够用函数来处理分支逻辑。

1import { ifElse } from 'ramda'; 2 3const hasAccess = true; 4 5const logAccess = ifElse( 6 () => hasAccess, 7 () => console.log('Access granted.'), 8 () => console.log('Access denied.') 9); 10 11logAccess();

一个优点是,你可以将逻辑封装成函数。不再硬编码 hasAccess 变量,而是将其作为参数。

1import { ifElse } from 'ramda'; 2 3const logAccess = ifElse( 4 (hasAccess) => hasAccess, 5 () => console.log('Access granted.'), 6 () => console.log('Access denied.') 7); 8 9logAccess(true);

并且,不再使用 console.log 这类副作用,而是通过返回期望的结果来实现纯函数。

1import { ifElse } from 'ramda'; 2 3const logAccess = ifElse( 4 (hasAccess) => hasAccess, 5 () => 'Access granted.', 6 () => 'Access denied.' 7); 8 9const result = logAccess(true); 10 11console.log({ result });

这使得编写无参风格(point-free)的代码更加容易。

1import { always, equals, ifElse } from 'ramda'; 2 3const logAccess = ifElse( 4 equals(true), 5 always('Access granted.'), 6 always('Access denied.') 7); 8 9const result = logAccess(true); 10 11console.log({ result });

最终结果也更容易测试!

排序

when 与 unless