导入
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 });
最终结果也更容易测试!