spinny:~/writing $ less advanced-typescript-patterns.md
12TypeScript đã trở thành tiêu chuẩn ngành cho phát triển web quy mô lớn. Mặc dù hầu hết các lập trình viên đều biết các kiến thức cơ bản về interface và type, sức mạnh thực sự nằm ở hệ thống type nâng cao. Dưới đây là 5 mẫu sẽ giúp bạn nổi bật với tư cách là một kỹ sư cao cấp.34## 1. Generic Constraints56Generics rất mạnh mẽ, nhưng đôi khi bạn cần giới hạn những gì có thể được truyền vào. `extends` là người bạn đồng hành của bạn ở đây.78```typescript9interface HasId {10 id: string;11}1213function getById<T extends HasId>(list: T[], id: string): T | undefined {14 return list.find((item) => item.id === id);15}16```1718Bằng cách đảm bảo `T` kế thừa `HasId`, chúng ta đảm bảo rằng việc truy cập `.id` bên trong hàm là an toàn.1920## 2. Conditional Types2122Conditional types cho phép bạn tạo các ánh xạ type không đồng nhất. Cú pháp tương tự như toán tử ba ngôi trong JavaScript.2324```typescript25type IsString<T> = T extends string ? true : false;2627type A = IsString<string>; // true28type B = IsString<number>; // false29```3031Một trường hợp sử dụng thực tế là lọc các type từ một union:3233```typescript34type Diff<T, U> = T extends U ? never : T;35type NonNullable<T> = Diff<T, null | undefined>;36```3738## 3. Mapped Types3940Mapped types cho phép bạn tạo các type mới dựa trên các type cũ bằng cách biến đổi các thuộc tính.4142```typescript43type ReadOnly<T> = {44 readonly [P in keyof T]: T[P];45};4647interface User {48 name: string;49 age: number;50}5152type ReadOnlyUser = ReadOnly<User>;53```5455Bạn thậm chí có thể thêm hoặc xóa các modifier:5657```typescript58type Mutable<T> = {59 -readonly [P in keyof T]: T[P];60};61```6263## 4. Template Literal Types6465Được giới thiệu trong TypeScript 4.1, chúng cho phép bạn thao tác trực tiếp với các kiểu chuỗi.6667```typescript68type World = 'world';69type Greeting = `hello ${World}`; // "hello world"7071type Color = 'red' | 'blue';72type Quantity = 'light' | 'dark';7374type Palette = `${Quantity}-${Color}`;75// "light-red" | "light-blue" | "dark-red" | "dark-blue"76```7778Điều này cực kỳ hữu ích để định kiểu cho các chuỗi tuân theo một mẫu cụ thể, như các lớp CSS hoặc tên sự kiện.7980## 5. Từ khóa `infer`8182Từ khóa `infer` trong conditional types cho phép bạn trích xuất type từ các type khác.8384```typescript85type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;8687function check(): boolean {88 return true;89}9091type CheckReturn = ReturnType<typeof check>; // boolean92```9394Ở đây, chúng ta yêu cầu TypeScript "suy luận" kiểu trả về `R` của một hàm và trả về nó.9596## Kết luận9798Thành thạo các mẫu này cho phép bạn viết các thư viện và tiện ích mạnh mẽ, mang lại trải nghiệm phát triển (DX) tuyệt vời. Mục tiêu của TypeScript nâng cao không phải là sự phức tạp vì sự phức tạp, mà là sự an toàn và khả năng biểu đạt.99
:5 Mẫu TypeScript Nâng Cao Dành Cho Kỹ Sư Cao Cấplines 1-99 (END) — press q to close