Làm Chủ Strict Mode Trong TypeScript — Biến Trình Biên Dịch Thành "Code Reviewer"

0 0 0

Người đăng: hiệp nguyễn

Theo Viblo Asia

Làm Chủ Strict Mode Trong TypeScript — Biến Trình Biên Dịch Thành "Code Reviewer"

Bạn viết TypeScript nhưng vẫn để trình biên dịch dễ dãi như JavaScript? Vậy đã đến lúc bạn làm quen với Strict Mode — công cụ giúp TypeScript phát huy tối đa sức mạnh kiểm tra kiểu tĩnh, bắt lỗi sớm và hướng bạn đến một codebase sạch, rõ ràng, và cực kỳ đáng tin cậy.


Bật strict mode

Chỉ cần thêm "strict": true vào tsconfig.json, bạn đang bật một gói các kiểm tra cực kỳ nghiêm ngặt:

{ "compilerOptions": { "strict": true }
}

Việc này tương đương với bật hàng loạt tùy chọn nhỏ hơn. Cùng tìm hiểu từng cái:


1. strictNullChecks

Bật lên: bạn không thể gán null hoặc undefined cho một biến nếu bạn không cho phép điều đó.

let name: string = null; // ❌ Lỗi nếu strictNullChecks = true

Muốn cho phép? Hãy rõ ràng:

let name: string | null = null;

Vì sao quan trọng? 80% lỗi runtime của JavaScript là do undefined is not a function, null has no property.... Tùy chọn này cắt luôn mầm mống đó.


2. noImplicitAny

TypeScript cho phép suy luận kiểu, nhưng đôi khi nó “bó tay” và fallback về any. Tùy chọn này không cho phép điều đó xảy ra trong im lặng.

function log(message) { console.log(message);
}
// 👆 message ngầm định là `any`

Với noImplicitAny: true, bạn bắt buộc phải khai báo kiểu rõ ràng:

function log(message: string) { console.log(message);
}

3. strictFunctionTypes

Tùy chọn này làm việc với hệ thống kiểm tra tương thích hàm.

Ví dụ:

type A = (value: number) => void;
type B = (value: number | string) => void; let fn: B = (val) => console.log(val); let f: A = fn; // ❌ strictFunctionTypes: không an toàn

Nó giúp đảm bảo bạn không gán một function "có thể xử lý nhiều hơn" cho một function "xử lý ít hơn", tránh lỗi logic.


4. strictBindCallApply

Khi bạn dùng .bind, .call, .apply — TypeScript mặc định không kiểm tra kỹ lắm. Tùy chọn này buộc bạn dùng đúng kiểu đối số.

function greet(name: string) { return `Hi ${name}`;
} greet.call(null, 123); // ❌ Số không phải string

5. strictPropertyInitialization

Yêu cầu bạn phải khởi tạo tất cả property trong class trước khi dùng, hoặc rõ ràng đánh dấu là có thể undefined.

class User { name: string; // ❌ Không được khởi tạo constructor() {}
}

Cách fix:

class User { name: string; constructor() { this.name = "Anonymous"; }
}

Hoặc nếu bạn thực sự biết mình đang làm gì:

class User { name!: string; // Dùng `!` để nói “Tôi sẽ tự khởi tạo sau”
}

6. noImplicitThis

Ngăn bạn dùng this trong function mà TypeScript không thể suy luận kiểu của this.

function show() { console.log(this.name); // ❌ this là gì?
}

Giải pháp:

  • Dùng function trong context class
  • Hoặc dùng arrow function để giữ this:
const show = () => { console.log(this.name);
};

7. alwaysStrict

Tự động chèn "use strict" vào tất cả file JS output. Điều này giúp môi trường runtime của bạn tránh những hành vi kỳ lạ của JS kiểu cổ.


Tổng kết

Tùy chọn Ý nghĩa
strictNullChecks Cấm null/undefined nếu không khai báo
noImplicitAny Bắt khai báo rõ ràng kiểu nếu không suy luận được
strictFunctionTypes Kiểm tra tương thích hàm chặt chẽ hơn
strictBindCallApply Bắt lỗi khi dùng bind/call/apply sai kiểu
strictPropertyInitialization Bắt buộc khởi tạo property class
noImplicitThis Không cho phép this mơ hồ
alwaysStrict JS output luôn ở chế độ "use strict"

Lời khuyên từ người từng "gãy"

  • Dự án mới? Bật strict ngay từ đầu.
  • Dự án cũ? Bật từng phần, sửa dần.
  • Làm frontend hay backend đều nên bật.

Code nghiêm ngặt là code đáng tin. Strict mode không phải gò bó bạn — nó giúp bạn an toàn hơn và ngủ ngon hơn.

Happy strict coding! 🚀

Bình luận

Bài viết tương tự

- vừa được xem lúc

Javascrpit clean code

Konnichiwa mina-san, hôm nay mình sẽ giới thiệt một số tips để code các bạn được clean hơn. . Variables. Functions.

0 0 37

- vừa được xem lúc

Code tốt hơn bằng cách làm theo các phương pháp hay nhất về JavaScript này

Cho dù bạn là một nhà phát triển dày dặn kinh nghiệm đang tìm cách tinh chỉnh phong cách viết mã của mình hay một người mới bắt đầu mong muốn nắm bắt các yếu tố cần thiết, bài đăng này là dành cho bạn

0 0 29

- vừa được xem lúc

TypeScript Clean Code

TypeScript tricks for Clean Code. Chúng ta sẽ khám phá 10 TypeScript ticks để viết mã sạch, kèm theo các ví dụ minh họa cách chúng hoạt động và lý do chúng hữu ích.

0 0 15

- vừa được xem lúc

[Clean code] Source code hoàn hảo thì không có quá nhiều comments?

Thông qua chương 4 cuốn Clean code - Robert C.Martin sẽ phần nào giải đáp câu hỏi trên.

0 0 6

Clean Architecture là gì - Ưu nhược và cách dùng hợp lý

Clean Architecture là gì - Ưu nhược và cách dùng hợp lý. Clean Architecture là một kiến trúc ứng dụng nổi tiếng, dựa trên nguyên lý loại bỏ sự lệ thuộc giữa các đối tượng cũng như các layer trong ứng

0 0 0

NAT (Network Address Translation) là gì? Tại sao backend có thể ra Internet mà không có IP public?

NAT (Network Address Translation) là gì? Tại sao backend có thể ra Internet mà không có IP public. . 1. NAT là gì.

0 0 0