Kiểu điều kiện TypeScript

Các kiểu điều kiện trong TypeScript cung cấp một cách để tạo các kiểu phụ thuộc vào một điều kiện. Chúng cho phép linh hoạt và biểu cảm hơn trong các định nghĩa kiểu, giúp có thể mô hình hóa các mối quan hệ kiểu phức tạp theo cách rõ ràng và súc tích. Bài viết này khám phá cách các kiểu điều kiện hoạt động trong TypeScript và cung cấp các ví dụ để minh họa cách sử dụng chúng.

Kiểu điều kiện là gì?

Kiểu điều kiện cho phép tạo ra các kiểu được chọn dựa trên một điều kiện. Chúng tương tự như các câu lệnh điều kiện trong lập trình nhưng hoạt động ở cấp độ kiểu. Cú pháp cơ bản của kiểu điều kiện là:

type ConditionalType = T extends U ? X : Y;

Trong cú pháp này:

  • T là kiểu đang được kiểm tra.
  • U là kiểu dữ liệu cần so sánh.
  • X là kiểu được trả về nếu T mở rộng U.
  • Y là kiểu được trả về nếu T không mở rộng U.

Ví dụ cơ bản về các loại điều kiện

Sau đây là một ví dụ đơn giản về kiểu dữ liệu có điều kiện trả về các kiểu dữ liệu khác nhau dựa trên việc kiểu dữ liệu đó có phải là chuỗi hay không:

type IsString = T extends string ? "String" : "Not a string";

type Result1 = IsString;  // Result1 is "String"
type Result2 = IsString;  // Result2 is "Not a string"

Trong ví dụ này, IsString kiểm tra xem T có mở rộng string không. Nếu có, kết quả là "String"; nếu không, kết quả là "Not a string".

Sử dụng các loại điều kiện với các loại chung

Các kiểu có điều kiện cũng có thể được sử dụng với các kiểu chung để tạo ra các định nghĩa kiểu linh hoạt và có thể tái sử dụng hơn. Ví dụ, một kiểu trích xuất kiểu trả về của một hàm:

type ReturnType = T extends (...args: any[]) => infer R ? R : never;

type FunctionType = (x: number) => string;

type Result = ReturnType;  // Result is string

Trong ví dụ này, ReturnType sử dụng từ khóa infer để suy ra kiểu trả về R của kiểu hàm T. Nếu T là kiểu hàm, ReturnType sẽ là kiểu trả về; nếu không, mặc định là never.

Các loại điều kiện với các loại hợp nhất

Các kiểu điều kiện cũng có thể hoạt động với các kiểu hợp nhất để xử lý nhiều kiểu có thể có. Ví dụ, phân biệt giữa các thành viên hợp nhất khác nhau:

type ExtractString = T extends string ? T : never;

type UnionType = string | number | boolean;

type Result = ExtractString;  // Result is string

Trong ví dụ này, ExtractString trích xuất string từ kiểu hợp nhất UnionType, tạo ra string.

Các kiểu có điều kiện với các kiểu ánh xạ

Các kiểu có điều kiện có thể được kết hợp với các ánh xạ kiểu để tạo ra các phép biến đổi kiểu phức tạp hơn. Ví dụ, ánh xạ trên một mảng các kiểu để áp dụng một kiểu có điều kiện:

type MapArray = {
  [K in keyof T]: T[K] extends string ? T[K] : never;
};

type ArrayType = [string, number, boolean];

type MappedArray = MapArray;  // MappedArray is [string, never, never]

Trong ví dụ này, MapArray ánh xạ qua từng phần tử của mảng T và áp dụng kiểu có điều kiện cho từng phần tử, tạo ra một mảng chỉ giữ nguyên các phần tử chuỗi.

Phần kết luận

Các kiểu điều kiện trong TypeScript là một công cụ mạnh mẽ để tạo ra các định nghĩa kiểu linh hoạt và biểu cảm. Bằng cách tận dụng các kiểu điều kiện, các nhà phát triển có thể mô hình hóa các mối quan hệ kiểu phức tạp, xử lý nhiều tình huống khác nhau và cải thiện tính an toàn của kiểu trong mã TypeScript của họ. Hiểu cách sử dụng các kiểu điều kiện hiệu quả có thể nâng cao đáng kể khả năng viết mã TypeScript mạnh mẽ và dễ bảo trì.