Exclude<T, U> — TypeScript'te bir türü diğerinden çıkarmak için kullanılabilen bir utility type olup, union türünden bazı değerleri hariç tutmak için gereklidir.
TypeScript'te bir türü diğerinden çıkarmanın kullanışlı bir yolu yoktu. Genel API'ler oluşturulurken ya da refaktörizasyon sırasında genellikle "artık" türü almak gerekiyordu — yasaklı değerler dışında her şey. Birkaç benzer arabirimi desteklemek yerine union üzerinde manuel işlem yapmak sıkıntılıydı.
Örneğin, 'A | B | C' türü varsa, fakat B hariç tür almak gerekiyorsa. Bu sıkça, fonksiyonların karmaşık giriş parametrelerini oluştururken, izin verilen değerleri filtrelerken ve dinamik türler oluştururken gerekir.
Exclude bu problemi çözer. Kolaylaştırılmış imzası şöyledir:
type Exclude<T, U> = T extends U ? never : T;
Bu, T'den U'daki tüm üyeleri hariç tutarak bir tür döndürür.
Örnek:
type Status = 'draft' | 'published' | 'removed'; type UserVisibleStatus = Exclude<Status, 'removed'>; const visible: UserVisibleStatus = 'draft'; // TAMAM
Anahtar özellikler:
Exclude normal türler için de kullanılabilir mi, yoksa sadece union için mi?
Eğer T union tür değilse ama U'da bulunuyorsa — Exclude yine çalışır, fakat sonucu never veya T olabilir, bu her zaman sezgisel olmayabilir.
Exclude<'a', 'a'> // sonuç: never Exclude<'a', 'b'> // sonuç: 'a'
Exclude bir türün nesne yapısındaki tüm referanslarını siler mi?
Hayır, Exclude, bir türdeki iç içe alanları rekürsif olarak geçmez, sadece union'ın üst düzeyinde hariç tutar.
Exclude arayüzlerle ve nesne türleriyle nasıl çalışır?
Tüm türü karşılaştırır, ayrı ayrı özellikleri değil. Bu nedenle birden fazla arayüzün union'ından Exclude, yalnızca U ile tam olarak eşleşenleri siler.
interface A { x: number }; interface B { y: string }; // Exclude<A|B, B> verir: A (B tam olarak eşleşiyor)
Kullanıcı rolleri doğrulaması için Exclude<UserRoles, 'admin'> kullanıldı, ama Exclude'ün iç içe yapılara uygulanmadığı unutuldu — 'admin:sub' hakkı hariç tutulmadı.
Artılar:
Eksiler:
Public API'yi eylemlerle kısıtlamak için Exclude kullanımı: Exclude<Action, 'delete'>, bu da tehlikeli bir işlemi hariç tutar.
Artılar:
Eksiler: