Hoppa till innehåll
i18n-error-base
Svenska
Esc
↑↓navigera↵öppna⌘Jförhandsvisa
På den här sidan

Användning

Grundläggande åtgärder för att definiera felklasser, registrera meddelanden, byta språk, prefix och fallback.

Grundläggande flöde

Definiera en felklass

Ärv I18nErrorBase<TMeta> och definiera info för meddelandegenerering i TMeta.

Registrera meddelanden per språk

Registrera meddelandet per klass och språk med setErrorMessage.

Byt språk och läs message

Byt med setGlobalConfig({ lang }) och läs 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

Definiera en felklass

TMeta är hjälpeinfo för meddelandegenerering. Den behålls som error.meta och skickas till registrerade funktioner.

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" }

Konstruktorns andra argument är en sträng eller en (meta) => string-funktion. Det tredje är { cause } och andra Error-alternativ.

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

Om du sätter TMeta till undefined kan du utelämna meta.

class NoMetaError extends I18nErrorBase<undefined> {}

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

Registrera meddelanden

setErrorMessage registrerar fabriksfunktioner per klass och språk.

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

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

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

Strängar är också tillåtna. Språk kan anges som arrayer.

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

Omregistrering av samma klass och språk skriver över. Den gäller endast när konstruktorerna vid registrering och uppslagning är identiska, inte via instanceof.

Byta språk

Byt med Valibots globala konfiguration. message refererar till aktuell lang vid varje åtkomst.

import { setGlobalConfig } from "valibot";

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

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

Oinställd lang är "en". Oregistrerade språk använder konstruktorns standardmeddelande.

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

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

Lägga till ett prefix

static prefix läggs till i början av det lösta meddelandet. Det gäller både översatta meddelanden och standardmeddelanden.

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"

När det inte är inställt returneras meddelandet som det är.

Beteende som Error

  • error instanceof Error, instanceof I18nErrorBase och instanceof <konkret klass> är alla true
  • String(error) / error.toString() inkluderar det lösta meddelandet (t.ex. "Error: ...")
  • cause behålls via { cause }

Vanliga mönster

Fixera standardmeddelandet i konstruktorn

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);
  }
}

Anropare skickar bara meta, vilket undviker duplicering av standardtexten.

Registrera flera språk samtidigt

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

Språkkoder normaliseras inte. "en" och "en-US" är separata nycklar, så registrera behövda koder explicit.

Var den här sidan till hjälp?