---
title: Tham chiếu API
description: Đặc tả của I18nErrorBase, setErrorMessage và các type liên quan.
---

## `I18nErrorBase` [#i18n-error-base]

Lớp cơ sở để kế thừa `Error`. `message` giải quyết theo `lang`.

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

class MyError extends I18nErrorBase<{ code: string }> {}
```

### Tham số type [#type-params]

| Prop | Type | Default | Description |
| ---- | ---- | ------- | ----------- |
| `TMeta` | `ErrorMeta \| undefined` | `ErrorMeta \| undefined` | Kiểu của `meta`. Nếu không dùng, chỉ định `undefined`. |

### Thuộc tính static [#static-props]

| Prop | Type | Default | Description |
| ---- | ---- | ------- | ----------- |
| `prefix?` | `string` | `undefined` | Nối vào đầu thông báo đã giải quyết. |

### Thuộc tính instance [#instance-props]

| Prop | Type | Description |
| ---- | ---- | ----------- |
| `meta` | `TMeta` | Thông tin bổ trợ từ constructor. Đọc/ghi được. |
| `message` | `string` | Giải quyết theo `lang` hiện tại. Liệt kê được. |
| `cause` | `unknown` | Nguyên nhân qua `ErrorOptions`. Thuộc tính chuẩn của `Error`. |

### Constructor [#constructor]

Nếu `TMeta` không bao gồm `undefined`, `meta` là bắt buộc.

```ts
new MyError(meta, message, options?)
```

Nếu `TMeta` là `undefined`, bạn có thể bỏ qua `meta`.

```ts
new MyError(message, options?)
new MyError(meta, message, options?)
```

| Tham số | Kiểu | Mô tả |
| ------------ | -- | ---- |
| `meta` | `TMeta` | Thông tin bổ trợ để tạo thông báo. |
| `message` | `string \| MessageFactory<TMeta>` | Thông báo mặc định cho ngôn ngữ chưa đăng ký. Hàm nhận `meta`. |
| `options` | `ErrorOptions` | Option tương thích với tham số thứ 2 của `Error` (`{ cause }` v.v.). |

### Thứ tự giải quyết [#resolution-order]

1. Lấy `lang` của `getGlobalConfig()` (khi chưa thiết lập là `"en"`)
2. Chạy hàm đã đăng ký cho class và ngôn ngữ đó kèm `meta`
3. Nếu chưa đăng ký, dùng thông báo mặc định
4. Nếu có `static prefix`, nối vào đầu

:::note
Đăng ký theo từng class. Đăng ký của cha không kế thừa. Hãy đăng ký từng class.
:::

## `setErrorMessage` [#set-error-message]

Đăng ký hàm tạo thông báo theo từng ngôn ngữ.

```ts
import { setErrorMessage } from "i18n-error-base";

setErrorMessage(MyError, (meta) => `...: ${meta.code}`, "ja");
```

| Tham số | Kiểu | Mô tả |
| ------------ | -- | ---- |
| `reference` | `I18nErrorBaseConstructor` | Class kế thừa `I18nErrorBase`. Ngược lại lỗi type. |
| `message` | `string \| (meta) => string` | Thông báo đăng ký. Kiểu `meta` suy ra từ class đích. |
| `lang` | `string \| Iterable<string>` | Ngôn ngữ đích. Một mã đơn hoặc iterable (như mảng). |

Đăng ký lại cùng class và ngôn ngữ sẽ ghi đè.

## Type [#types]

### `ErrorMeta` [#error-meta]

```ts
type ErrorMeta = {
  readonly [prop: string]: unknown;
};
```

Ràng buộc mặc định của `TMeta`. Đối tượng chỉ đọc có thuộc tính tùy ý.

### `ErrorOptions` [#error-options]

```ts
type ErrorOptions =
  ConstructorParameters<typeof Error> extends [
    message?: unknown,
    options?: (infer TOptions) | undefined,
  ]
    ? TOptions
    : { readonly cause?: unknown };
```

Type suy ra từ tham số thứ 2 của `Error`. Có thể truyền `cause`.

### `MessageFactory<TMeta>` [#message-factory]

```ts
interface MessageFactory<TMeta extends ErrorMeta | undefined = ErrorMeta | undefined> {
  (meta: TMeta): string;
}
```

Hàm tạo thông báo từ `meta`. Dùng cho cả mặc định và đã đăng ký.

### `I18nErrorBaseParams<TMeta>` [#i18n-error-base-params]

Overload tham số constructor.

```ts
type I18nErrorBaseParams<TMeta extends ErrorMeta | undefined = ErrorMeta | undefined> =
  [TMeta] extends [undefined]
    ?
        | [message: string | MessageFactory<TMeta>, options?: ErrorOptions | undefined]
        | [meta: undefined, message: string | MessageFactory<TMeta>, options?: ErrorOptions | undefined]
    : [meta: TMeta, message: string | MessageFactory<TMeta>, options?: ErrorOptions | undefined];
```

Chỉ khi `TMeta` là `undefined` mới được bỏ `meta`.

### `I18nErrorBaseConstructor` [#i18n-error-base-constructor]

```ts
interface I18nErrorBaseConstructor {
  new (...args: any): I18nErrorBase;
}
```

Type của tham số thứ nhất của `setErrorMessage`.

## Ghi chú bổ sung [#notes]

- Mặc định `lang` là `"en"`. Hãy chuyển rõ ràng bằng `setGlobalConfig({ lang })`
- Không chuẩn hóa mã ngôn ngữ hay chuỗi fallback (ví dụ `en-US` → `en`). Ngôn ngữ chưa đăng ký thành thông báo mặc định
