Trước khi đi sâu vào phần chính, hãy cùng tìm hiểu về khái niệm "Conditional types".
"Conditional types" trong TypeScript cho phép chúng ta tạo ra các loại dữ liệu mà kiểu của chúng phụ thuộc vào một điều kiện cụ thể. Cú pháp chung của "Conditional types" như sau:
T extends U ? X : Y
Trong đó:
T extends U
là điều kiện cần kiểm tra. Nếu T
có thể gán cho U
, điều kiện này trả về true
.X
là kiểu dữ liệu sẽ được sử dụng nếu điều kiện trên là true
.Y
là kiểu dữ liệu sẽ được sử dụng nếu điều kiện trên là false
.
Bây giờ, chúng ta sẽ xem cách sử dụng "Conditional types" với "interfaces" trong TypeScript.
Giả sử chúng ta có một interface Person
như sau:
interface Person {
name: string;
age: number;
}
Và chúng ta muốn tạo một loại dữ liệu mới, MaybePerson
, mà kiểu của nó phụ thuộc vào một biến T
có thể gán cho Person
hay không. Chúng ta có thể sử dụng "Conditional types" như sau:
type MaybePerson<T> = T extends Person ? T : never;
Trong đó:
T extends Person
kiểm tra xem T
có thể gán cho Person
hay không.T
có thể gán cho Person
, MaybePerson<T>
sẽ có kiểu là T
.T
không thể gán cho Person
, MaybePerson<T>
sẽ có kiểu là never
.Với cách sử dụng "Conditional types" với "interfaces" như trên, chúng ta có thể tạo ra các loại dữ liệu phức tạp hơn, linh hoạt hơn và kiểm soát được kiểu dữ liệu một cách chặt chẽ hơn.