Typescriptでのエラー型の定義


はじめに。

typescriptにおいて、エラーのハンドリングのためにエラーをthrowしてしまうと、インターフェースからはエラーが発生する可能性を読み取れないという問題が提起されていました。

https://zenn.dev/dowanna6/articles/82ba2d5ee6ae76

自分もこれを問題視しています。この問題に対して、Result型を定義することによりこの問題を回避していますので、なにかの参考になれば幸いです。

Result型の導入

以下を定義します。

Result.ts
export type Result<Success, Error> = Ok<Success> | Err<Error>;

export type Ok<Success> = {
  data: Success;
  type: "success";
};

export type Err<Error> = { 
  data: Error; 
  type: "err" 
};

使い方

まず、OkErrを生成する関数を先に定義しておきます。

export const ok = <T>(data: T): Ok<T> => {
  return {
    data,
    type: "success"
  };
};

export const err = <T>(data: T): Err<T> => {
  return {
    data,
    type: "err"
  };
};

これらを用いた例が以下になります。(typescript4.6を使用しています。)

const result: Result<Success, Error> = someFunction();
const { data, type } = result;

if (type === "err") {
  /**
   * エラーのときの処理
   * このときのdataはError型です。
   */
   
   return
}

/**
 * 正常なときの処理
 * このときのdataはSuccess型です。
 */