# Mở rộng hoặc ghi đè interface đã khai báo trong file index.d.ts với thuộc tính initialData (ok)

### Example&#x20;

pages\index.tsx

<figure><img src="https://2086325979-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOfwU52oyTCInVkN26DVZ%2Fuploads%2FTsdcys0sbZ7tnEVD7n50%2Fimage.png?alt=media&#x26;token=d6659b9d-1463-4bd1-a9c3-e65ccbf98d57" alt=""><figcaption></figcaption></figure>

utils\index.d.ts

```typescript
export interface Options {
  manual?: boolean;
  useCache?: boolean;
  ssr?: boolean;
  autoCancel?: boolean;
}
```

utils\options-extension.d.ts

```typescript
import { Options as OriginalOptions } from './index'; // Đường dẫn đến file index.d.ts
declare module './index' {
  export interface Options extends OriginalOptions {
    initialData?: any; // Bạn có thể chỉ định kiểu cụ thể thay vì 'any'
  }
}
```

Để mở rộng (extend) hoặc ghi đè interface đã khai báo trong file index.d.ts với thuộc tính initialData trong dự án Next.js, bạn có thể làm theo một số cách sau. Tôi sẽ giải thích từng bước chi tiết:1. Mở rộng interface OptionsNếu bạn muốn thêm initialData vào interface Options mà không thay đổi file gốc index.d.ts, bạn có thể sử dụng module augmentation (mở rộng module) trong TypeScript. Điều này thường được sử dụng khi bạn làm việc với các thư viện bên ngoài hoặc mã nguồn mà bạn không muốn chỉnh sửa trực tiếp.Ví dụ:Giả sử file index.d.ts ban đầu của bạn trông như thế này:typescript

```typescript
export interface Options {
  manual?: boolean;
  useCache?: boolean;
  ssr?: boolean;
  autoCancel?: boolean;
}
```

Bây giờ, bạn muốn thêm initialData vào interface Options. Bạn có thể tạo một file mới (ví dụ: options-extension.d.ts) trong dự án Next.js của mình và mở rộng interface như sau:typescript

```typescript
// options-extension.d.ts
import { Options as OriginalOptions } from './index'; // Đường dẫn đến file index.d.ts

declare module './index' {
  export interface Options extends OriginalOptions {
    initialData?: any; // Bạn có thể chỉ định kiểu cụ thể thay vì 'any'
  }
}
```

* declare module './index': Chỉ định rằng bạn đang mở rộng module từ file index.d.ts.
* extends OriginalOptions: Kế thừa tất cả các thuộc tính hiện có của Options và thêm initialData.
* initialData?: any: Thêm thuộc tính mới, ở đây tôi dùng any làm ví dụ, nhưng bạn nên thay bằng kiểu cụ thể (ví dụ: string, number, hoặc kiểu dữ liệu tùy chỉnh).

Lưu ý:

* Đảm bảo file options-extension.d.ts được bao gồm trong cấu hình TypeScript của bạn (thường thì TypeScript sẽ tự động nhận các file .d.ts trong dự án).
* Trong tsconfig.json của Next.js, kiểm tra xem include có chứa đường dẫn đến file mới không (mặc định thường là \["\*\*/\*.ts", "\*\*/\*.tsx"]).

Sau đó, bạn có thể sử dụng Options với thuộc tính initialData trong mã của mình:typescript

```typescript
const myOptions: Options = {
  manual: true,
  initialData: "some data", // Hoạt động bình thường
};
```

2\. Ghi đè interface OptionsNếu bạn có quyền chỉnh sửa trực tiếp file index.d.ts (ví dụ: đây là file trong dự án của bạn, không phải từ thư viện bên ngoài), bạn chỉ cần thêm initialData vào interface ban đầu:typescript

```typescript
// index.d.ts
export interface Options {
  manual?: boolean;
  useCache?: boolean;
  ssr?: boolean;
  autoCancel?: boolean;
  initialData?: any; // Thêm trực tiếp vào đây
}
```

Sau khi cập nhật, TypeScript sẽ tự động nhận diện initialData là một phần của Options.3. Sử dụng trong Next.jsVì bạn đang dùng Next.js, bạn có thể áp dụng interface Options này trong các hook hoặc logic liên quan (chẳng hạn như useQuery nếu bạn dùng thư viện như @tanstack/react-query). Ví dụ:typescript

```typescript
import { Options } from './index';

function fetchData(options: Options) {
  console.log(options.initialData); // Truy cập được initialData
}

fetchData({ manual: true, initialData: "preload data" });
```

4\. Chỉ định kiểu cụ thể cho initialDataThay vì để initialData?: any, bạn nên định nghĩa kiểu cụ thể dựa trên nhu cầu của mình. Ví dụ:

* Nếu initialData là một chuỗi:typescript

  ```typescript
  initialData?: string;
  ```
* Nếu initialData là một object phức tạp:typescript

  ```typescript
  initialData?: { id: number; name: string };
  ```
* Nếu initialData có thể là nhiều kiểu khác nhau:typescript

  ```typescript
  initialData?: string | number | { id: number; name: string };
  ```

5\. Kiểm tra và áp dụngSau khi mở rộng hoặc ghi đè interface, hãy chạy dự án Next.js (npm run dev hoặc yarn dev) để đảm bảo TypeScript không báo lỗi. Nếu có lỗi, kiểm tra lại đường dẫn import hoặc cấu hình tsconfig.json.Kết quả cuối cùngGiả sử bạn chọn cách mở rộng bằng file riêng, mã của bạn có thể trông như thế này:typescript

```typescript
// options-extension.d.ts
import { Options as OriginalOptions } from './index';

declare module './index' {
  export interface Options extends OriginalOptions {
    initialData?: string; // Ví dụ kiểu cụ thể
  }
}

// Sử dụng trong file .tsx
import { Options } from './index';

const config: Options = {
  manual: true,
  initialData: "Hello World",
};
```

Hy vọng giải thích này giúp bạn mở rộng interface Options thành công trong dự án Next.js! Nếu bạn cần thêm hỗ trợ, cứ hỏi nhé!
