fp-ts の fromNullable について(あまり需要がなさそうな記事)

fp-ts には便利な関数として、fromNullable があります。

この関数に undefined や null を渡すと、none を返してくれます。

一方で、それ以外の値を渡すと some を返してくれます。

以下のようになります。

const a = fromNullable(1)
const b = fromNullable(undefined)
const c = fromNullable(null)

console.log(a) // { _tag: 'Some', value: 1 }
console.log(b) // { _tag: 'None' }
console.log(c) // { _tag: 'None' }

さて、この fromNullable を使うと、少し便利なことができます。

もともと以下のような number か undefined を返す関数 userAge があるとします。

type User = {
    id: number
    age: number | undefined
}

const userAge = (user: User) => user.age

この userAge を undefined だったら none を返し、それ以外ならsomeを返すようにしたい場合、もともとの userAge を変更せずに以下のようにすることで実現できます。

const userAgeOpt = flow(userAge, fromNullable)

const d = userAgeOpt({id: 1, age: 10})
const e = userAgeOpt({id: 2, age: undefined})

console.log(d) // { _tag: 'Some', value: 10 }
console.log(e) // { _tag: 'None' }

flow というのは pipe と同じで、関数を連結します。

上の場合は、userAge を実行して、その戻り値を fromNullable に渡して実行する、ということになります。

fromNullable を使うことで、元の userAge を変更することなく、Option に対応した新しい関数を作成できるので便利かなと少し思いました。