JavaScript TypeScript カリーによって引数を減らすメリット 事例

例えば、以下のような数値を更新する関数があるとします。

const increment = (num: number) => num + 1

const double = (num: number) => num * 2

const updateByType = (num: number, type : 0 | 1) => type === 0 ? num + 1 : num + 2

ある値に対して、これらの関数を順番に適用して値を更新したいとします。

const currentType = 1

let init = 1
init = increment(init)
init = double(init)
init = updateByType(init, currentType)

init // 6

さてこれでも良いのですが、initという変数を削除し、関数型プログラミングの考えで、関数の配列を順番に適用する方法を考えてみます。

const updateFns = [
    increment,
    double,
    updateByType,
]

updateFns.reduce((acc, fn) => {
    return fn(acc)
}, 1)

reduceを使うとできるのですが、ここで問題になるのがupdateByTypeだけ引数が二つのために、上のコードではエラーになるのです。

そこで、カリー化して引数を一つに統一します。

全体のコードは以下です。

const increment = (num: number) => num + 1

const double = (num: number) => num * 2

// カリー化
const updateByType = (type: 0 | 1) => (num: number) => type === 0 ? num + 1 : num + 2

const currentType: 0 | 1 = 1

const updateFns = [
    increment,
    double,
    updateByType(currentType),
]

updateFns.reduce((acc, fn) => {
    return fn(acc)
}, 1)
//6