getOrElse関数が便利

最近、fp-tsについて調べる機会がありました。

github.com

TypeScriptで関数型言語っぽい事が出来るライブラリです。 プロジェクトに盛り込むことも考えましたが 現時点ではメリットが少なく導入には至りませんでした。

調べていく中でgetOrElse関数を見つけて、これ使えるんじゃねと思ったので備忘録として記録します。

getOrElse関数とは

fp-tsのgetOrElse関数はSomeの場合は中の値を返却しNoneの場合は設定した値を返却します。

gcanti.github.io

本来は関数型言語の考え方に則ってSomeやNoneで処理するべきですが プロジェクトに盛り込めなかったということでNullをNoneとして扱う[getOrElse関数もどき]を自作して使ってみました。

自作版 getOrElse関数

以下、自作したgetOrElse関数です。

値が存在する時とNULLだった時で返す型を一致させないとダメなので ジェネリクスで返却時の型を統一しています。

const gerOrElse = <T>(func: () => T) =><T2>{
  return (val: T2 | null) =>{
    if(val === null){
      return func()
    }else{
      return val
    }
  }
}

自作版getOrElse関数を使う

自作版getOrElse関数は、以下の条件の時に使えます

  • サーバ側からのレスポンスがnumber | nullやstring | nullの型を持っている
  • nullだった場合デフォルト値を適用して処理を継続しなければならない

自作版getOrElse関数を使ってコードを修正してみました。 まずは改善前のコードを掲載します。

// 改善前のコード

type Info = {
  name: string,
  kana: string,
  testFlg: boolean,
  zip: null | string,
  birthday: null | string,
  other: null | string,
  age: null | number
}

const createEditForm = (info: Info) =>({
  name: info.name,
  kana: info.kana,
  testFlg: info.testFlg,
  zip: info.zip === null ? "" : info.zip,
  birthday: info. birthday === null ? "" :  info.birthday,
  other: info.other === null ? "" : info.other,
  age: info.age === null ? 0 : info.age
})

次に改善後のコード。

// 改善後のコード

const gerOrElseNumber = getOrElse(()=> 0)
const gerOrElseStr = getOrElse(()=> "")

type Info = {
  name: string,
  kana: string,
  age: number
  testFlg: boolean,
  zip: null | string,
  birthday: null | string,
  other: null | string,
}

const createEditForm = (info: Info) =>({
  name: info.name,
  kana: info.kana,
  testFlg: info.testFlg,
  zip: gerOrElseStr(Info.zip),
  birthday: gerOrElseStr(info.birthday),
  age: gerOrElseNumber(info.age),
})

三項演算子が多く見栄えが悪かったですが、getOrElse関数で一掃しました。