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
| Nom | Type | Requis | Défaut | Description |
|---|---|---|---|---|
className | string | oui | — | Valeur de error.name sur les instances générées |
codes | Record<string, string> | oui | — | La 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 laconst, sinonerror as LegbaXxxErrorne compile pas. - Le constructeur prend toujours
(code, message), jamais juste(message)— y compris pour un domaine à un seul code (voirLegbaConfigError) : la prévisibilité du moule prime sur l’économie d’un argument.