Het mechanisme Partial<T> is geïntroduceerd in TypeScript om het werken met objecten te vergemakkelijken waarvan de eigenschappen tijdelijk niet gedefinieerd kunnen zijn. Historisch gezien moesten ontwikkelaars handmatig nieuwe types maken waarin alle eigenschappen optioneel waren, wat leidde tot duplicatie van code en fouten.
Oorspronkelijk moest je bij het bijwerken of maken van objecten met optionele velden elk optioneel eigenschap expliciet opgeven, wat onhandig was en geen ondersteuning bood voor veranderingen in de oorspronkelijke interface. Zo ontstond het utility type Partial<T>, dat automatisch alle eigenschappen van type T optioneel maakt.
Bij het ontwerpen van API's is het vaak nodig om alleen een deel van een object bij te werken, zonder de andere velden aan te tasten. Dit is vooral relevant voor PATCH-verzoeken, updateforms en functies die slechts een deel van de gegevens verwerken. Zonder Partial wordt typificatie complex en kwetsbaar.
Het utility type Partial<T> wordt ongeveer als volgt gedefinieerd:
// Vereenvoudigd: type Partial<T> = { [P in keyof T]?: T[P] };
Hierdoor worden alle eigenschappen optioneel gemaakt. Voorbeeld:
interface User { id: number; name: string; email: string; } function updateUser(id: number, user: Partial<User>) { // ... } // Je kunt alleen het veranderde doorgeven updateUser(1, { email: "test@example.com" });
Belangrijke kenmerken:
Kan je met behulp van Partial alle velden van de oorspronkelijke interface verplicht maken?
Nee, Partial maakt alle eigenschappen optioneel. Voor het omgekeerde is er het type Required<T>.
Wat gebeurt er als je Partial gebruikt met al optionele eigenschappen?
Partial zal eenvoudigweg de al optionele eigenschappen niet wijzigen, alle velden blijven optioneel, zelfs als ze optioneel waren voordat Partial werd toegepast.
Voorbeeld:
interface X { x?: number; y: string; } const a: Partial<X> = {}; // beide eigenschappen zijn nu optioneel
Kun je Partial gebruiken voor geneste structuren als je alleen geneste velden optioneel wilt maken?
Partial wordt niet recursief toegepast op geneste objecten. Als je alle geneste eigenschappen optioneel wilt maken, moet je je eigen generieke type schrijven of externe hulpprogramma's gebruiken.
In een CRUD-systeem accepteert updateUser Partial<User> en staat het toe een leeg object door te geven, wat leidt tot runtime-fouten: verplichte velden worden gewist.
Voordelen:
Nadelen:
Partial<User> wordt alleen toegepast voor het beschrijven van de invoervorm voor updates. In de laatste fase worden alle velden gevalideerd en samengevoegd met het originele object voordat ze in de database worden opgeslagen.
Voordelen:
Nadelen: