TypeScriptでResult型を書く

例外は型に現れない。失敗しうる関数の戻り値を Result で表すと、呼び出し側に処理を強制できる。

定義

type Result<T, E = Error> = { ok: true; value: T } | { ok: false; error: E }

const ok = <T>(value: T): Result<T, never> => ({ ok: true, value })
const err = <E>(error: E): Result<never, E> => ({ ok: false, error })

使う

function parseAge(input: string): Result<number, string> {
  const n = Number(input)
  if (!Number.isInteger(n) || n < 0) return err(`不正な年齢: ${input}`)
  return ok(n)
}

const result = parseAge("42")
if (result.ok) {
  console.log(result.value + 1) // number として扱える
} else {
  console.error(result.error)
}

長い行

横スクロールの確認用。

const veryLongLine = [
  "alpha",
  "beta",
  "gamma",
  "delta",
  "epsilon",
  "zeta",
  "eta",
  "theta",
  "iota",
  "kappa",
  "lambda",
  "mu",
]
  .map((s) => s.toUpperCase())
  .join(", ")

シェルも:

pnpm validate && pnpm build