Naar inhoud springen
i18n-error-base
Nederlands
Esc
↑↓navigeren↵openen⌘Jvoorbeeld
Op deze pagina

Gebruik

Basisbewerkingen voor het definiëren van foutklassen, het registreren van berichten, het wisselen van taal, prefix en fallback.

Basisflow

Een foutklasse definiëren

Erf over van I18nErrorBase<TMeta> en definieer info voor het genereren van berichten in TMeta.

Berichten per taal registreren

Registreer met setErrorMessage het bericht per klasse en taal.

Van taal wisselen en message lezen

Wissel met setGlobalConfig({ lang }) en lees error.message.

import { setGlobalConfig } from "valibot";
import { I18nErrorBase, setErrorMessage } from "i18n-error-base";

class BusinessRuleError extends I18nErrorBase<{ code: string; limit: number }> {
  public constructor(meta: { code: string; limit: number }) {
    super(meta, ({ code, limit }) => `Code: ${code}, Limit: ${limit}`);
  }
}

setErrorMessage(
  BusinessRuleError,
  ({ code, limit }) => `コード: ${code}、制限: ${limit}`,
  "ja",
);

const error = new BusinessRuleError({ code: "ERR", limit: 50 });

setGlobalConfig({ lang: "ja" });
console.log(error.message); // コード: ERR、制限: 50

setGlobalConfig({ lang: "en" });
console.log(error.message); // Code: ERR, Limit: 50

Een foutklasse definiëren

TMeta is aanvullende info voor het genereren van berichten. Het wordt bewaard als error.meta en doorgegeven aan geregistreerde functies.

import { I18nErrorBase } from "i18n-error-base";

class NotFoundError extends I18nErrorBase<{ resource: string }> {}

const error = new NotFoundError({ resource: "user" }, "fallback message");
console.log(error.meta); // { resource: "user" }

Het tweede constructorargument is een tekenreeks of een (meta) => string-functie. Het derde is { cause } en andere Error-opties.

class TestError extends I18nErrorBase<{ code: string }> {}

const cause = new Error("original");
const error = new TestError({ code: "ERR" }, "something went wrong", { cause });
console.log(error.cause === cause); // true

Als je TMeta op undefined instelt, kun je meta weglaten.

class NoMetaError extends I18nErrorBase<undefined> {}

const a = new NoMetaError("no meta");
const b = new NoMetaError(undefined, "no meta");
console.log(a.meta); // undefined

Berichten registreren

setErrorMessage registreert fabrieksfuncties per klasse en taal.

import { I18nErrorBase, setErrorMessage } from "i18n-error-base";

class TestError extends I18nErrorBase<{ code: string }> {}

setErrorMessage(TestError, ({ code }) => `エラーコード: ${code}`, "ja");
setErrorMessage(TestError, "something went wrong", "en");

Tekenreeksen zijn ook toegestaan. Talen kunnen als arrays worden opgegeven.

const message = ({ code }: { code: string }) => `エラーコード: ${code}`;
setErrorMessage(TestError, message, ["ja", "ko", "zh"]);

Opnieuw registreren voor dezelfde klasse en taal overschrijft. Het geldt alleen wanneer de constructors bij registratie en opzoeken overeenkomen, niet via instanceof.

Van taal wisselen

Wissel via de globale instelling van Valibot. message verwijst bij elke toegang naar de actuele lang.

import { setGlobalConfig } from "valibot";

setGlobalConfig({ lang: "ja" });
console.log(error.message); // 日本語の登録メッセージ

setGlobalConfig({ lang: "en" });
console.log(error.message); // 英語の登録メッセージ or 既定メッセージ

Niet-ingestelde lang is "en". Niet-geregistreerde talen gebruiken het standaardbericht uit de constructor.

setErrorMessage(BusinessRuleError, () => "日本語メッセージ", "ja");

setGlobalConfig({ lang: "fr" });
console.log(error.message); // "Code: ERR, Limit: 50"(既定メッセージ)

Een voorvoegsel toevoegen

static prefix wordt vooraan het opgeloste bericht geplaatst. Dit geldt voor zowel vertaalde als standaardberichten.

class PrefixedError extends I18nErrorBase<{ code: string }> {
  static {
    this.prefix = "[ERROR] ";
  }
}

setErrorMessage(PrefixedError, ({ code }) => `code is ${code}`, "ja");
const error = new PrefixedError({ code: "ERR" }, "fallback");

setGlobalConfig({ lang: "ja" });
console.log(error.message); // "[ERROR] code is ERR"

setGlobalConfig({ lang: "en" });
console.log(error.message); // "[ERROR] fallback"

Wanneer niet ingesteld, wordt het bericht zoals het is teruggegeven.

Gedrag als Error

  • error instanceof Error, instanceof I18nErrorBase en instanceof <concrete klasse> zijn alle true
  • String(error) / error.toString() bevat het opgeloste bericht (bijv. "Error: ...")
  • cause wordt bewaard via { cause }

Veelvoorkomende patronen

Het standaardbericht vastzetten in de constructor

class BusinessRuleError extends I18nErrorBase<{ code: string; limit: number }> {
  public constructor(meta: { code: string; limit: number }, options?: ErrorOptions) {
    super(meta, ({ code, limit }) => `Code: ${code}, Limit: ${limit}`, options);
  }
}

Aanroepers hoeven alleen meta door te geven en voorkomen zo duplicatie van de standaardtekst.

Meerdere talen tegelijk registreren

setErrorMessage(MyError, "エラーが発生しました", ["ja"]);
setErrorMessage(MyError, "An error occurred", ["en", "en-US"]);

Taalcodes worden niet genormaliseerd. "en" en "en-US" zijn afzonderlijke sleutels, dus registreer benodigde codes expliciet.

Was deze pagina nuttig?