Nhảy tới nội dung

Exclude<T, U>

Exclude<T, U> là utility type trả về union type sau khi loại bỏ kiểu được chỉ định trong U khỏi union type T.

Type argument của Exclude<T, U>

T

Type argument T nhận union type.

U

Type argument U nhận kiểu muốn loại bỏ khỏi T.

Ví dụ sử dụng Exclude

ts
type Grade = "A" | "B" | "C" | "D" | "E";
type PassGrade = Exclude<Grade, "E">;
ts
type Grade = "A" | "B" | "C" | "D" | "E";
type PassGrade = Exclude<Grade, "E">;

PassGrade ở trên sẽ giống với kiểu sau:

ts
type PassGrade = "A" | "B" | "C" | "D";
ts
type PassGrade = "A" | "B" | "C" | "D";

Nếu argument thứ 2 của Exclude là union type, có thể loại bỏ nhiều kiểu:

ts
type Grade = "A" | "B" | "C" | "D" | "E";
type PassGrade = Exclude<Grade, "D" | "E">;
type PassGrade = "A" | "B" | "C"
ts
type Grade = "A" | "B" | "C" | "D" | "E";
type PassGrade = Exclude<Grade, "D" | "E">;
type PassGrade = "A" | "B" | "C"

Lưu ý khi sử dụng Exclude

U không có ràng buộc phải là tập con của T. Tức là cần chú ý để không đưa kiểu không tồn tại trong T vào U, hoặc typo. Trong ví dụ sau, hãy hiểu nó như là kiểu liên quan đến Pull Request.

ts
type PullRequestState = "draft" | "reviewed" | "rejected";
type MergeableState = Exclude<PullRequestState, "draft" | "rejected">;
type MergeableState = "reviewed"
ts
type PullRequestState = "draft" | "reviewed" | "rejected";
type MergeableState = Exclude<PullRequestState, "draft" | "rejected">;
type MergeableState = "reviewed"

MergeableState có nghĩa là reviewed, nhưng cách sử dụng Exclude này có 2 vấn đề tiềm ẩn.

Khi thêm trạng thái mới vào PullRequestState

Giả sử thêm trạng thái testFailed mà bạn không muốn bao gồm trong MergeableState vào PullRequestState. Khi đó, cùng với sửa đổi này, bạn cũng phải sửa argument thứ 2 của MergeableState đồng thời. Nếu quên việc này, testFailed sẽ được bao gồm trong MergeableState.

ts
type PullRequestState = "draft" | "reviewed" | "rejected" | "testFailed";
type MergeableState = Exclude<PullRequestState, "draft" | "rejected">;
type MergeableState = "reviewed" | "testFailed"
ts
type PullRequestState = "draft" | "reviewed" | "rejected" | "testFailed";
type MergeableState = Exclude<PullRequestState, "draft" | "rejected">;
type MergeableState = "reviewed" | "testFailed"

Khi có thay đổi

draft của PullRequestState đã được đổi thành open. Trong trường hợp này, nếu quên sửa argument thứ 2 của Exclude, open sẽ được bao gồm trong MergeableState.

ts
type PullRequestState = "open" | "reviewed" | "rejected";
type MergeableState = Exclude<PullRequestState, "draft" | "rejected">;
type MergeableState = "open" | "reviewed"
ts
type PullRequestState = "open" | "reviewed" | "rejected";
type MergeableState = Exclude<PullRequestState, "draft" | "rejected">;
type MergeableState = "open" | "reviewed"