modifyC

modify関数を以下のように定義する

function modify<T extends object, K extends keyof T>(key: K, f: (old: T[K]) => T[K], struct: T): T

オブジェクトのキーとmapする関数を受け取って、キーに入っている値をMapする関数

こいつをCurry化した関数が


function modifyC<K extends string, T>(key: K, f: (old: T) => T): <U extends {[P in K]: T}>(x: U) => U {
    return function <U extends {[P in K]: T}>(struct: U): U {
        const newStruct: U = Object.assign({}, struct);
        newStruct[key] = f(struct[key]);
        return newStruct;
    }
}

これ

めっちゃ多相

tsは:curry:化するときに型をいい感じに変えたほうが型注釈書かなくて便利 :muscle: (雑な:curry:化 だと型注釈を書かないikenai)