Declaration merging là việc TypeScript kết hợp nhiều khai báo có cùng tên thành một định nghĩa duy nhất. Interface, namespace, và một số cấu trúc khác sẽ merge tự động.
Interface merging
interface Box { : ; }
{ : ; }
Declaration merging là việc TypeScript kết hợp nhiều khai báo có cùng tên thành một định nghĩa duy nhất. Interface, namespace, và một số cấu trúc khác sẽ merge tự động.
interface Box { : ; }
{ : ; }
Đây là cách bạn thêm type vào các thư viện hoặc các global mà bạn không sở hữu:
// Thêm một property tùy chỉnh vào Request của Express
declare global {
namespace Express {
interface Request { user?: { id: string }; } // merge vào Express.Request
}
}
request.user; // ✅ giờ đã có type ở mọi nơi
// Augment một module
declare module "some-lib" {
interface Options { newOption: boolean; }
}
Vì Request/Options của thư viện là một interface, khai báo của bạn sẽ merge vào nó thay vì xung đột — cho phép bạn mở rộng an toàn các type mà bạn không thể chỉnh sửa.
function greet() {}
namespace greet { export const version = "1.0"; }
greet.version; // "1.0" — namespace đã merge vào function
type không làm được điều nàytype A = { x: number };
type A = { y: number }; // ❌ Lỗi: định danh trùng lặp
Type alias là duy nhất; chỉ có interface (và namespace) merge được — một lý do then chốt để dùng interface cho các shape public API có thể mở rộng.
Declaration merging là cơ chế đằng sau module augmentation — mở rộng request của Express, thêm vào window, tùy chỉnh type của thư viện, các hệ thống theming.
Đây là kiến thức thiết yếu để type các ứng dụng thực tế, nơi bạn phải thích ứng với các type mà bạn không kiểm soát được, mà không cần fork chúng.
Thư viện câu hỏi phỏng vấn IT với đáp án chi tiết — từ Junior đến Senior.
Ủng hộ