Bài học theo mô-đun (1/2)
Loại bảo vệ
Thu hẹp kiểu chữ là một trong những khái niệm quan trọng nhất trong TypeScript. Tuy nhiên, thông thường, các loại bảo vệ tiêu chuẩn như typeof hoặc instanceof là không đủ cho các đối tượng tùy chỉnh phức tạp. Đây là lúc Vệ sĩ loại tùy chỉnh phát huy tác dụng.
Bảo vệ loại tiêu chuẩn
Hãy bắt đầu bằng cách tóm tắt cách TypeScript thu hẹp các loại bằng cách sử dụng toán tử JavaScript tiêu chuẩn:
function processInput(val: string | number) {
if (typeof val === 'string') {
// Here 'val' is of type string
console.log(val.toUpperCase());
} else {
// Here 'val' is of type number
console.log(val.toFixed(2));
}
}Bộ bảo vệ loại tùy chỉnh (toán tử is)
Để xác định trình bảo vệ kiểu tùy chỉnh, chúng tôi tạo một hàm trả về vị ngữ loại ở định dạng parameterName is Type thay vì kiểu trả về boolean tiêu chuẩn.
Hàm phải trả về giá trị boolean (true hoặc false). Nếu nó trả về true, TypeScript sẽ biết rằng tham số đã truyền thuộc loại đã chỉ định.
interface Cat {
name: string;
meow(): void;
}
interface Dog {
name: string;
bark(): void;
}
// This is a custom type guard
function isCat(animal: Cat | Dog): animal is Cat {
return (animal as Cat).meow !== undefined;
}
function makeNoise(pet: Cat | Dog) {
if (isCat(pet)) {
// Here TypeScript knows 'pet' is a Cat
pet.meow();
} else {
// Here TypeScript knows 'pet' is a Dog
pet.bark();
}
}An toàn và đúc (as so với Type Guards)
Truyền kiểu (ví dụ: val as Cat) buộc trình biên dịch phải tin cậy nhà phát triển mà không có bất kỳ xác minh thời gian chạy thực nào. Nếu đối tượng thời gian chạy không đáp ứng được mong đợi, mã sẽ âm thầm bị lỗi hoặc đưa ra các ngoại lệ.
Mặt khác, các bộ bảo vệ kiểu tùy chỉnh thực hiện kiểm tra thời gian chạy mạnh mẽ và năng động, thông báo một cách an toàn và chính xác cho trình biên dịch TypeScript về loại biến thực tế:
function processInput(input: unknown) {
// unsafe casting: could crash if input does not have the split method
// const str = input as string;
// console.log(str.split(' '));
// safe guard
if (isString(input)) {
console.log(input.split(' ')); // 100% Safe!
}
}Hãy tự mình thử
Bài tập 1: Bảo vệ kiểu chuỗi
Tạo một hàm đơn giản có tên isString hoạt động như một bộ bảo vệ kiểu tùy chỉnh để xác minh xem giá trị không xác định có phải là một chuỗi hay không.
Hiển thị gợi ý
Kiểu trả về của hàm phải là val là chuỗi và bạn nên sử dụng typeof để kiểm tra xem nó có bằng 'chuỗi' hay không.
Giải pháp khả dụng sau 3 lần thử
Bài tập 2: Bảo vệ loại người dùng cao cấp
Với các loại Người dùng và Người dùng cao cấp, hãy viết một loại hàm bảo vệ isPremiumUser(user: User): user là PremiumUser để kiểm tra xem người dùng có vai trò 'cao cấp' hay không.
Hiển thị gợi ý
Xác định chữ ký là hàm isPremiumUser(user: User): user là PremiumUser và so sánh user.role với 'premium'.
Giải pháp khả dụng sau 3 lần thử
Bài tập 3: Xác thực đối tượng lỗi tùy chỉnh
Triển khai isCustomError(err: known): err là hàm CustomError xác minh xem giá trị không xác định có phải là đối tượng CustomError không null có chứa khóa 'code' hay không.
Hiển thị gợi ý
Trước tiên hãy kiểm tra xem typeof err có phải là 'đối tượng' chứ không phải null hay không, sau đó sử dụng toán tử 'in' để kiểm tra thuộc tính 'code'.
Giải pháp khả dụng sau 3 lần thử
Bài tập 4: Bảo vệ loại quản trị viên
Cho hai giao diện Người dùng (có vai trò thuộc tính: chuỗi) và Quản trị viên (mở rộng Người dùng và có thuộc tính adminToken: chuỗi), hãy viết một hàm bảo vệ kiểu có tên isAdmin chấp nhận người dùng thuộc loại Người dùng và trả về loại người dùng vị ngữ là Quản trị viên. Người bảo vệ phải kiểm tra xem vai trò của người dùng có bằng 'quản trị viên' hay không.
Hiển thị gợi ý
Xác định chữ ký là hàm isAdmin(user: User): người dùng là Quản trị viên và kiểm tra xem user.role === 'admin' hay không.
Giải pháp khả dụng sau 3 lần thử