Skip to content

date-fns v2.x 提供 函数式编程 (FP) 友好函数,例如 lodash 中的函数,支持柯里化。

用法

FP函数 通过 date-fns/fp 子模块提供。

带有选项的函数 (formatparse 等) 有两个 FP对应项:一个将选项对象作为其第一个参数,另一个则没有。前者的名称末尾添加了 WithOptions。

在 date-fns 的 FP函数 中,参数的顺序是相反的。

js
import { addYears, formatWithOptions } from 'date-fns/fp';
import { eo } from 'date-fns/locale';
import toUpper from 'lodash/fp/toUpper'; // 'date-fns/fp' 与 'lodash/fp' 兼容!

// 如果 FP 函数没有收到足够的参数,它将返回另一个函数
const addFiveYears = addYears(5);

// 可以同时调用多个参数
const dateToString = formatWithOptions({ locale: eo }, 'd MMMM yyyy');

const dates = [
    new Date(2017, 0 /* Jan */, 1),
    new Date(2017, 1 /* Feb */, 11),
    new Date(2017, 6 /* Jul */, 2)
];

const formattedDates = dates.map(addFiveYears).map(dateToString).map(toUpper);
//=> ['1 JANUARO 2022', '11 FEBRUARO 2022', '2 JULIO 2022']

使用函数组合

FP 函数的主要优点是支持函数式函数组合。

在上面的例子中,您可以将 addFiveYearsdateToStringtoUpper 组合成一个函数:

js
const formattedDates = dates.map((date) =>
    toUpper(dateToString(addFiveYears(date)))
);

或者你可以使用 lodash 提供的 compose 函数以更惯用的方式执行相同操作:

js
import { compose } from 'lodash/fp/compose';

const formattedDates = dates.map(compose(toUpper, dateToString, addFiveYears));

或者如果你更喜欢自然的创作方向 (而不是计算正确的顺序),你可以使用 lodash 的流程:

js
import flow from 'lodash/fp/flow';

const formattedDates = dates.map(flow(addFiveYears, dateToString, toUpper));

何以解忧,唯有代码。不忘初心,方得始终。