Open1

TypeScriptで例外クラスの定義をサボりながら静的に判別可能なエラーを返す

Nakano as a ServiceNakano as a Service
import type { Result, ResultAsync } from 'neverthrow';
import { err, errAsync } from 'neverthrow';

interface PubErrProps<C extends string, E = never> {
  /**
   * エラーを一意に識別するエラーコード。ユーザーにも公開する。
   */
  code: C;
  /**
   * ユーザーに表示するエラーメッセージ。
   */
  message: string;
  /**
   * エラーの原因となるオブジェクト。不用意にユーザーに公開してはならない。
   */
  cause?: E;
}

export class PubErr<C extends string, E = never> extends Error {
  code: C;
  cause!: E;

  constructor({ code, message, cause }: PubErrProps<C, E>) {
    super(message, { cause });
    this.code = code;
  }
}

export function pubErr<C extends string, T = never, E = never>(
  content: PubErrProps<C, E>,
): Result<T, PubErr<C, E>> {
  return err(new PubErr(content));
}

export function pubErrAsync<C extends string, T = never, E = never>(
  content: PubErrProps<C, E>,
): ResultAsync<T, PubErr<C, E>> {
  return errAsync(new PubErr(content));
}