Vấn đềTypeScript thường giúp phát hiện các lỗi logic, nhưng lỗi TS4114 lại liên quan đến tính toàn vẹn của cấu trúc code. Có thể bạn đã cập nhật các dependency hoặc tiếp nhận một dự án mà flag noImplicitOverride đang được bật. Khi bạn thực hiện build, trình biên dịch sẽ chặn lại với thông báo cụ thể:
TS4114: This member must have an 'override' modifier because it overrides a member in the base class 'Animal'.
Đây không phải là lỗi lúc thực thi (runtime). Thay vào đó, nó là một bước kiểm tra an toàn được thiết kế để ngăn bạn vô tình làm hỏng hệ thống phân cấp lớp (class hierarchies) trong quá trình bảo trì.
Đoạn mã gây lỗiLỗi này xảy ra khi một lớp con định nghĩa lại một phương thức từ lớp cha mà không nêu rõ mục đích của nó. Trong một codebase với hàng chục lớp kế thừa, rất dễ mất dấu phương thức nào là mới hoàn toàn và phương thức nào là ghi đè (shadowed).
class Animal {
makeSound(): void {
console.log("Tiếng kêu chung");
}
}
class Dog extends Animal {
// Lỗi: TS4114 xảy ra ở đây vì mục đích không rõ ràng
makeSound(): void {
console.log("Gâu gâu!");
}
}
Tại sao lỗi này tồn tạiKể từ phiên bản 4.3, TypeScript đã cung cấp từ khóa override để giải quyết vấn đề "lớp cơ sở mỏng manh" (fragile base class). Việc bắt buộc sử dụng modifier này giúp bảo vệ bạn khỏi hai tình huống phổ biến:
- Ghi đè vô ý (Accidental Shadowing): Bạn thêm một phương thức vào lớp con mà không biết rằng một phương thức trùng tên đã tồn tại trong lớp cha.- Thất bại âm thầm khi Refactoring: Bạn đổi tên
makeSoundthànhemitSoundở lớp cha. Nếu không có từ khóaoverride, phương thứcmakeSoundcủa lớp con sẽ trở thành một phương thức độc lập vô nghĩa thay vì là một phiên bản đặc biệt hóa của logic lớp cha.## Cách sửa lỗi TS4114### 1. Giải pháp tiêu chuẩn: Sử dụng Override rõ ràngCách tốt nhất để giải quyết vấn đề này là sử dụng từ khóaoverride. Điều này tạo ra một ràng buộc rõ ràng giữa lớp con và lớp cha. Nó thông báo cho trình biên dịch—và các lập trình viên sau này—chính xác những gì code của bạn dự định thực hiện.
class Dog extends Animal {
override makeSound(): void {
console.log("Gâu gâu!");
}
}
Nếu phương thức ở lớp cha bị xóa sau này, TypeScript sẽ báo lỗi TS4113. Phản hồi tức thì này đảm bảo rằng các lớp con của bạn không bao giờ tham chiếu đến các phương thức lớp cha không tồn tại.
2. Lối tắt toàn cục (TSConfig)Nếu bạn đang di chuyển một dự án cũ với hơn 50 lỗi và cần build thành công ngay lập tức, bạn có thể tắt tính năng kiểm tra này. Tuy nhiên, hãy nhớ rằng điều này sẽ loại bỏ một lớp bảo vệ quan trọng.
Cập nhật file tsconfig.json của bạn trong phần compilerOptions:
{
"compilerOptions": {
"noImplicitOverride": false
}
}
Thiết lập giá trị này thành false sẽ khôi phục hành vi của các phiên bản TypeScript cũ, nơi việc ghi đè luôn là ngầm định.
3. Lưu ý về ConstructorConstructor (hàm khởi tạo) là trường hợp đặc biệt. Bạn không cần từ khóa override cho chúng, ngay cả khi lớp cha có constructor riêng. Quy tắc này chỉ áp dụng cho các phương thức và thuộc tính.
Kiểm tra kết quảXác nhận các thay đổi bằng cách chạy trình biên dịch ở chế độ "no emit". Chế độ này kiểm tra lỗi mà không tạo ra các file JavaScript:
npx tsc --noEmit
Trong VS Code, các đường gạch dưới lỗi màu đỏ sẽ biến mất ngay lập tức. Nếu lỗi vẫn còn, hãy sử dụng Ctrl+Shift+P và chọn TypeScript: Restart TS Server để làm mới trạng thái của IDE.

