defineErrorType

expérimentaldepuis 0.1.0@legba-core/core

defineErrorType

Ce que ça fait

Génère une table de codes d’erreur et sa classe d’erreur associée (héritant de LegbaError), pour éviter de réécrire ce couple à la main pour chaque domaine (configuration, jetons, salles, participants, …).

Signature

function defineErrorType<Codes extends Record<string, string>>(
  className: string,
  codes: Codes,
): { codes: Codes; ErrorClass: new (code: Codes[keyof Codes], message: string) => LegbaError }

Paramètres

NomTypeRequisDéfautDescription
classNamestringouiValeur de error.name sur les instances générées
codesRecord<string, string>ouiLa table de codes du domaine, en général avec as const

Retour

Un objet { codes, ErrorClass }. codes est la table passée en paramètre, renvoyée telle quelle. ErrorClass est une classe qui étend LegbaError, dont le constructeur prend (code, message) — toujours ces deux arguments, même quand le domaine n’a qu’un seul code possible.

Erreurs

N/A — cette fonction ne lève jamais.

Exemple minimal

import { defineErrorType } from "@legba-core/core";

const { codes, ErrorClass } = defineErrorType("LegbaWidgetError", {
  NOT_FOUND: "LEGBA_WIDGET_NOT_FOUND",
} as const);

export const WIDGET_ERROR_CODES = codes;
export const LegbaWidgetError = ErrorClass;
export type LegbaWidgetError = InstanceType<typeof LegbaWidgetError>;

Exemple complet

import { defineErrorType } from "@legba-core/core";

const participantErrorType = defineErrorType("LegbaParticipantError", {
  INVALID_REQUEST: "LEGBA_INVALID_PARTICIPANT_REQUEST",
  PARTICIPANT_NOT_FOUND: "LEGBA_PARTICIPANT_NOT_FOUND",
  FORBIDDEN: "LEGBA_PARTICIPANT_FORBIDDEN",
} as const);

export const PARTICIPANT_ERROR_CODES = participantErrorType.codes;
export const LegbaParticipantError = participantErrorType.ErrorClass;
export type LegbaParticipantError = InstanceType<typeof LegbaParticipantError>;

// usage, à l'intérieur du code qui vient de constater l'absence du
// participant (fonction isolée ici pour garder l'exemple autonome) :
function participantIntrouvable(identity: string, roomName: string): never {
  throw new LegbaParticipantError(
    PARTICIPANT_ERROR_CODES.PARTICIPANT_NOT_FOUND,
    `participant "${identity}" introuvable dans la salle "${roomName}".`,
  );
}

Pièges

  • La classe générée n’a pas d’identité de type propre par défaut : exporter aussi export type LegbaXxxError = InstanceType<typeof LegbaXxxError>; juste après la const, sinon error as LegbaXxxError ne compile pas.
  • Le constructeur prend toujours (code, message), jamais juste (message) — y compris pour un domaine à un seul code (voir LegbaConfigError) : la prévisibilité du moule prime sur l’économie d’un argument.

Voir aussi