Exclude<T, U> is een utility type dat is verschenen in TypeScript voor het aftrekken van één type van een ander, wanneer het nodig is om bepaalde waarden uit een union type te verwijderen.
Oorspronkelijk was er in TypeScript geen handige manier om een type van een ander af te trekken. Bij het creëren van generieke API's, evenals bij refactoring, was het vaak nodig om het "resterende" type te verkrijgen — alles behalve de verboden waarden. In plaats van handmatige manipulaties met union, moest men meerdere vergelijkbare interfaces ondersteunen.
Bijvoorbeeld, wanneer er een type 'A | B | C' is, maar je moet het type zonder B krijgen. Dit is vaak nodig bij het opbouwen van complexe invoerparameters van functies, filtering van toegestane waarden en dynamische typevorming.
Exclude lost dit probleem op. De vereenvoudigde handtekening is als volgt:
type Exclude<T, U> = T extends U ? never : T;
Het retourneert een type dat alle leden van U uitsluit uit T.
Voorbeeld:
type Status = 'draft' | 'published' | 'removed'; type UserVisibleStatus = Exclude<Status, 'removed'>; const visible: UserVisibleStatus = 'draft'; // OK
Belangrijke kenmerken:
Kan Exclude worden gebruikt voor gewone types en niet union?
Als T geen union-type is, maar in U zit — zal Exclude nog steeds werken, maar het resultaat kan never of T zijn, wat niet altijd intuïtief is.
Exclude<'a', 'a'> // resultaat: never Exclude<'a', 'b'> // resultaat: 'a'
Verwijdert Exclude alle vermeldingen van het type in de objectstructuur?
Nee, Exclude gaat niet recursief door geneste velden van het type, het sluit alleen op het hoogste niveau van de union uit.
Hoe werkt Exclude met interfaces en object types?
Het vergelijkt het hele type en niet afzonderlijke eigenschappen. Daarom verwijdert Exclude uit een union van verschillende interfaces alleen diegenen die volledig overeenkomen met U.
interface A { x: number }; interface B { y: string }; // Exclude<A|B, B> geeft: A (B komt volledig overeen)
Validatie van gebruikersrollen via Exclude<UserRoles, 'admin'>, maar vergeten dat Exclude niet wordt toegepast op geneste structuren — de rechten 'admin:sub' werden niet uitgesloten.
Voordelen:
Nadelen:
Gebruik Exclude om de public API te beperken met acties: Exclude<Action, 'delete'>, wat de gevaarlijke operatie uitsluit.
Voordelen:
Nadelen: