---
title: ข้อมูลอ้างอิง API
description: ข้อมูลจำเพาะของ I18nErrorBase, setErrorMessage และชนิดที่เกี่ยวข้อง
---

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

คลาสพื้นฐานสำหรับสืบทอด `Error` `message` จะ resolve ตาม `lang`

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

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

### พารามิเตอร์ชนิด [#type-params]

| Prop | Type | Default | Description |
| ---- | ---- | ------- | ----------- |
| `TMeta` | `ErrorMeta \| undefined` | `ErrorMeta \| undefined` | ชนิดของ `meta` หากไม่ใช้ให้ระบุ `undefined` |

### คุณสมบัติสแตติก [#static-props]

| Prop | Type | Default | Description |
| ---- | ---- | ------- | ----------- |
| `prefix?` | `string` | `undefined` | เชื่อมไว้หน้าข้อความที่ resolve แล้ว |

### คุณสมบัติอินสแตนซ์ [#instance-props]

| Prop | Type | Description |
| ---- | ---- | ----------- |
| `meta` | `TMeta` | ข้อมูลประกอบจากคอนสตรักเตอร์ อ่านและเขียนได้ |
| `message` | `string` | resolve ตาม `lang` ปัจจุบัน สามารถ enumerate ได้ |
| `cause` | `unknown` | สาเหตุผ่าน `ErrorOptions` คุณสมบัติมาตรฐานของ `Error` |

### คอนสตรักเตอร์ [#constructor]

หาก `TMeta` ไม่รวม `undefined` `meta` เป็นค่าบังคับ

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

หาก `TMeta` เป็น `undefined` ละ `meta` ได้

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

| พารามิเตอร์ | ชนิด | คำอธิบาย |
| ------------ | -- | ---- |
| `meta` | `TMeta` | ข้อมูลประกอบสำหรับสร้างข้อความ |
| `message` | `string \| MessageFactory<TMeta>` | ข้อความเริ่มต้นสำหรับภาษาที่ยังไม่ลงทะเบียน หากเป็นฟังก์ชันจะรับ `meta` |
| `options` | `ErrorOptions` | ออปชันเข้ากันได้กับอาร์กิวเมนต์ตัวที่ 2 ของ `Error` (เช่น `{ cause }`) |

### ลำดับการ resolve [#resolution-order]

1. ดึง `lang` ของ `getGlobalConfig()` (หากยังไม่ตั้งค่าจะเป็น `"en"`)
2. เรียกฟังก์ชันที่ลงทะเบียนของคลาสและภาษานั้นพร้อม `meta`
3. หากยังไม่ลงทะเบียน ใช้ข้อความเริ่มต้น
4. หากมี `static prefix` เชื่อมไว้ด้านหน้า

:::note
การลงทะเบียนแยกตามคลาส การลงทะเบียนของแม่ไม่ตกทอด ลงทะเบียนแยกแต่ละคลาส
:::

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

ลงทะเบียนฟังก์ชันสร้างข้อความตามภาษา

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

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

| พารามิเตอร์ | ชนิด | คำอธิบาย |
| ------------ | -- | ---- |
| `reference` | `I18nErrorBaseConstructor` | คลาสที่สืบทอด `I18nErrorBase` ไม่ใช่จะเกิด type error |
| `message` | `string \| (meta) => string` | ข้อความที่จะลงทะเบียน ชนิด `meta` อนุมานจากคลาสเป้าหมาย |
| `lang` | `string \| Iterable<string>` | ภาษาเป้าหมาย รหัสเดียวหรืออ็อบเจกต์ทำซ้ำได้ (เช่นอาร์เรย์) |

การลงทะเบียนซ้ำในคลาสและภาษาเดิมจะเขียนทับ

## ชนิด [#types]

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

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

ข้อจำกัดเริ่มต้นของ `TMeta` อ็อบเจกต์อ่านอย่างเดียวที่มีคุณสมบัติตามต้องการ

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

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

ชนิดจากอาร์กิวเมนต์ตัวที่ 2 ของ `Error` ส่ง `cause` ได้

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

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

ฟังก์ชันสร้างข้อความจาก `meta` ใช้ทั้งค่าเริ่มต้นและค่าลงทะเบียน

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

overload อาร์กิวเมนต์คอนสตรักเตอร์

```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];
```

ละ `meta` ได้เฉพาะเมื่อ `TMeta` เป็น `undefined`

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

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

ชนิดอาร์กิวเมนต์ตัวที่ 1 ของ `setErrorMessage`

## หมายเหตุเพิ่มเติม [#notes]

- ค่าเริ่มต้น `lang` คือ `"en"` สลับชัดเจนด้วย `setGlobalConfig({ lang })`
- ไม่ normalize รหัสภาษาหรือ fallback chain (เช่น `en-US` → `en`) ภาษาที่ยังไม่ลงทะเบียนเป็นข้อความเริ่มต้น
