{"id":232057,"date":"2023-01-08T11:59:00","date_gmt":"2023-01-08T08:59:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232057"},"modified":"2022-11-10T07:26:07","modified_gmt":"2022-11-10T04:26:07","slug":"typescript-proprietes-selectionnees-facultatives-avec-partial-omit","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/typescript-proprietes-selectionnees-facultatives-avec-partial-omit\/","title":{"rendered":"TypeScript\u00a0: propri\u00e9t\u00e9s s\u00e9lectionn\u00e9es facultatives avec Partial &#038; Omit"},"content":{"rendered":"\n<p>Lorsque vous utilisez l&rsquo;utilitaire <code>Partial<\/code>sur un type, toutes les propri\u00e9t\u00e9s du type seront facultatives. Voyons comment nous pouvons composer cet utilitaire avec un autre, <code>Omit<\/code>, pour ne rendre facultatives que certaines propri\u00e9t\u00e9s de ce type. Nous allons enfin cr\u00e9er un type utilitaire en utilisant les g\u00e9n\u00e9riques TypeScript pour l&rsquo;appliquer \u00e0 n&rsquo;importe quel type que nous voulons.<\/p>\n<h2>Rendre toutes les propri\u00e9t\u00e9s d&rsquo;un type facultatives<\/h2>\n<p>Les utilitaires <code>Partial<\/code>et <code>Omit<\/code>sont bien connus dans le domaine <a href=\"https:\/\/startfunction.com\/tag\/typescript\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">TypeScript<\/a> car ils sont tr\u00e8s pratiques pour les appliquer rapidement \u00e0 un type et obtenir ce qui est fondamentalement un nouveau type. <code>Partial&lt;T&gt;<\/code>convertira toutes les cl\u00e9s d&rsquo;un type en option. Si par exemple vous avez ce type :<\/p>\n<pre><code>interface Band {\n    lead: string\n    guitar: string\n    bass: string\n    drums: string\n    keyboard: string\n}<\/code><\/pre>\n<p>toutes les propri\u00e9t\u00e9s sont requises quand quelque chose a ce type. Si vous souhaitez affecter un objet comme celui-ci\u00a0:<\/p>\n<pre><code>const FooFighters: Band = {\n    lead: 'Dave Grohl',\n    guitar: 'Pat Smears',\n    bass: 'Nate Mendel',\n    drums: 'Taylor Williams',\n}<\/code><\/pre>\n<p>il \u00e9chouera car il manque la <code>keyboard<\/code>propri\u00e9t\u00e9. Maintenant, nous pourrions marquer cette propri\u00e9t\u00e9 comme facultative et TypeScript nous permet facilement de le faire. La fa\u00e7on la plus simple de le faire est d&rsquo;ajouter un point d&rsquo;interrogation \u00e0 son nom. Dans ce cas, s&rsquo;il est possible de modifier le type d&rsquo;origine, vous pouvez y acc\u00e9der et le modifier comme ceci\u00a0:<\/p>\n<pre><code>interface Band {\n    lead: string\n    guitar: string\n    bass: string\n    drums: string\n    keyboard?: string\n}<\/code><\/pre>\n<p>Super. Maintenant, l&rsquo;affectation pr\u00e9c\u00e9dente r\u00e9ussira car elle <code>keyboard<\/code>n&rsquo;est plus n\u00e9cessaire. Mais que se passe-t-il s&rsquo;il n&rsquo;est pas possible de changer le type d&rsquo;origine pour une raison quelconque? Ce que vous pouvez faire rapidement dans ces cas, c&rsquo;est appliquer <code>Partial<\/code>\u00e0 ce type :<\/p>\n<pre><code>type NotAllTheBand = Partial\n\nconst FooFighters: NotAllTheBand = {\n    lead: 'Dave Grohl',\n    guitar: 'Pat Smears',\n    bass: 'Nate Mendel',\n    drums: 'Taylor Williams',\n}<\/code><\/pre>\n<p>Cela arr\u00eate d&rsquo;appliquer toutes les propri\u00e9t\u00e9s, les rendant toutes facultatives. Peut-\u00eatre que parfois nous voulons cela, mais que se passe-t-il si nous voulons juste rendre une seule propri\u00e9t\u00e9 facultative et \u00e9viter de modifier le type d&rsquo;origine ?<\/p>\n<h2>Supprimer des propri\u00e9t\u00e9s d&rsquo;un type<\/h2>\n<p>Avant de passer \u00e0 autre chose et de voir comment cela fonctionne, voyons un autre utilitaire qui nous aidera avec ceci: <code>Omit<\/code>. Ce type d&rsquo;utilitaire supprime les propri\u00e9t\u00e9s du type auquel il est appliqu\u00e9. While <code>Partial<\/code>ne prend pas d&rsquo;autres arguments que le type, <code>Omit<\/code>prend le type plus les propri\u00e9t\u00e9s que vous souhaitez supprimer\u00a0: <code>Omit&lt;T, K&gt;<\/code>.<\/p>\n<p>Ce n&rsquo;est pas comme <code>Partial<\/code>si cela les rend facultatifs\u00a0: <code>Omit<\/code>cela les effacera compl\u00e8tement du type. Lorsque vous l&rsquo;utilisez <code>Partial&lt;Band&gt;<\/code>, c&rsquo;est comme si vous aviez fait ceci\u00a0:<\/p>\n<pre><code>interface Band {\n    lead?: string\n    guitar?: string\n    bass?: string\n    drums?: string\n    keyboard?: string\n}<\/code><\/pre>\n<p>Cependant, lorsque vous utilisez <code>Omit&lt;Band, 'keyboard'&gt;<\/code>, c&rsquo;est comme si vous aviez fait ceci :<\/p>\n<pre><code>interface Band {\n    lead: string\n    guitar: string\n    bass: string\n    drums: string\n}<\/code><\/pre>\n<p>Cela commence maintenant \u00e0 avoir un sens, non\u00a0? Pouvez-vous imaginer ce que nous pourrions faire dans TypeScript si nous avions un type qui a toutes les propri\u00e9t\u00e9s de l&rsquo;original d\u00e9fini sur optionnel et un autre type qui n&rsquo;a que les propri\u00e9t\u00e9s que nous voulons exiger? Si seulement il y avait un moyen de\u2026 croiser ces types, n&rsquo;est-ce pas ?<\/p>\n<h2>Types d&rsquo;intersection<\/h2>\n<p>Oui, il existe un moyen dans TypeScript d&rsquo;utiliser l&rsquo;esperluette <code>&amp;<\/code>, l&rsquo;op\u00e9rateur d&rsquo;intersection de type. Cet op\u00e9rateur, \u00e9tant donn\u00e9 deux types, en construit un nouveau avec les propri\u00e9t\u00e9s qui appartiennent aux deux types\u00a0:<\/p>\n<pre><code>interface SomeType {\n    propA: string\n    propB: number\n}\n\ninterface AnotherType {\n    propC: boolean\n    propD: Array\n}\n\ntype IntersectedType = SomeType &amp; AnotherType\n<\/code><\/pre>\n<p>Vous l&rsquo;avez probablement compris maintenant: nous allons croiser un type partialis\u00e9 et un type dont nous avons supprim\u00e9 certaines de ses propri\u00e9t\u00e9s.<\/p>\n<h2>Rendre facultatives les propri\u00e9t\u00e9s s\u00e9lectionn\u00e9es d&rsquo;un type<\/h2>\n<p>Essayons de lui donner un sens. Il est important lors de l&rsquo;apprentissage de TypeScript de rationaliser ce qui se passe avec nos types.<\/p>\n<p>Nous allons saisir un type dont toutes les propri\u00e9t\u00e9s sont d\u00e9finies sur facultatives gr\u00e2ce \u00e0 <code>Partial<\/code>l&rsquo;application. Ensuite, nous allons l&rsquo;intersecter avec un type dont les propri\u00e9t\u00e9s s\u00e9lectionn\u00e9es ont \u00e9t\u00e9 supprim\u00e9es par <code>Omit<\/code>. Voyons un exemple\u00a0:<\/p>\n<pre><code>interface SomeType {\n    propA: string\n    propB: number\n}\n\ntype OptionalPropB = Partial &amp; Omit<\/code><\/pre>\n<p>Nous avons maintenant un nouveau type, sans modifier le type d&rsquo;origine, qui ressemble \u00e0 ceci\u00a0:<\/p>\n<pre><code>type OptionalPropB = {\n    propA: string\n    propB?: string\n}<\/code><\/pre>\n<p>Cela se produit parce que nous r\u00e9cup\u00e9rons des propri\u00e9t\u00e9s <code>propA?<\/code>et <code>propB?<\/code>du type produit par <code>Partial<\/code>et que nous les croisons avec <code>propA<\/code>le type produit par <code>Omit<\/code>.<\/p>\n<h2>Utilitaires g\u00e9n\u00e9riques TypeScript<\/h2>\n<p>Ok, maintenant notre nouveau type fonctionne et nous ne pouvons avoir que des propri\u00e9t\u00e9s s\u00e9lectionn\u00e9es marqu\u00e9es comme facultatives sans modifier le type d&rsquo;origine. Cependant, cette ligne<\/p>\n<pre><code>type OptionalPropB = Partial &amp; Omit<\/code><\/pre>\n<p>Est trop verbeux, assez moche et fastidieux \u00e0 \u00e9crire \u00e0 chaque fois. Plus important encore, cela ne fonctionnera pas pour un type diff\u00e9rent, nous devrons le r\u00e9\u00e9crire \u00e0 chaque fois. Pouvons-nous le rendre plus court et plus joli, et le faire fonctionner pour n&rsquo;importe quel type\u00a0? Oui, TypeScript nous permet d&rsquo;utiliser des g\u00e9n\u00e9riques ici et de cr\u00e9er notre propre type d&rsquo;utilitaire\u00a0:<\/p>\n<pre><code>type Optional = Partial &amp; Omit<\/code><\/pre>\n<p>Et maintenant, nous avons notre propre type d&rsquo;utilitaire TypeScript impl\u00e9ment\u00e9 avec des g\u00e9n\u00e9riques que nous pouvons utiliser pour rendre les propri\u00e9t\u00e9s de type s\u00e9lectionn\u00e9es facultatives dans n&rsquo;importe quel type. Nous pouvons l&rsquo;utiliser comme ceci :<\/p>\n<pre><code>type TypeWithOptionalProp = Optional<\/code><\/pre>\n<p>Vous remarquerez que la signature est similaire \u00e0 Omit\u00a0: cet utilitaire prend le type sur lequel op\u00e9rer et les propri\u00e9t\u00e9s qui seront rendues facultatives. Si vous en avez plus, vous pouvez utiliser l&rsquo;op\u00e9rateur union\u00a0:<\/p>\n<pre><code>type TypeWithOptionalProps = Optional<\/code><\/pre>\n<h2>Mots de cl\u00f4ture<\/h2>\n<p>Vous pouvez d\u00e9sormais enregistrer ce type d&rsquo;utilitaire g\u00e9n\u00e9rique dans un fichier et l&rsquo;exporter pour l&rsquo;utiliser dans l&rsquo;ensemble de votre application. Voici un <a href=\"https:\/\/www.typescriptlang.org\/play?#code\/JYOwLgpgTgZghgYwgAgMoHsC2EAqBPABxQG8AoZC5AqdAgQQC5kBnMKUAc3MutoCEmIAK6YARtG4VeBAMJNR6dABsIcEKQC+pUqEixEKOiHRgAFtHxFkZSlRr0mrdiC63pc5AuWr1W0mEIUAAU4KDBgOCVLFABeZBCwiKUAHgxsaIA+f0DkAHlMYDBo5Dj8wtSsXECAGmQAcmk+OqyAqwBJcGhmCARIABNiuLSqqwAyZCMTcyho7KtcgnD0EEig+z4S+NDwyIr0wIzkcbKwPZGIWob15u0AelvkHCg8ZCgITHQAN047Wjpaxq1dBQX6yWpgdDIT7QYAwF5mCB4OpvZC0JYrJQAOlICGWrGQkFYAEYmAkdlEcnEbKDGPVREohBA6tVuI0mESAEwAZhZUnsHjYjJZGgA3HcHk8XnA+n0fo0CZDoew4chCnVmK8IABHITAN59bG4kD4wlgDlME6Days+y0ur0xnMm20AVQIWaMWke6PZ6aj7fFw0gHrIEg9zgxUwlUIpEot46vUQA04vFgAkQVhcpgdPTdXpJq3U6R2h1M3mggTITk852yJiCi4e8U+qUyuXrBVQqMvNUatHAZaRbHeyV+r7tv6osP8ztK2E9sDqzUJ-WG1Pp1gAFgtiwHGLW-E2RdtTHtDLLtdd7tFzYA4gBRABy94ASm0ZMgAKo4NoAGTaOAAJoAIRzCgCzorsOC1AA0sgEAAB6QCAfQagA1oi6AwI8hxxGSSTJDghzHAUpzQcgMFZGBjyBAA6oUpgQXuqz2BqpS7oOKTDNElyNHUyAAD71O4NxehKvrSrKgbysCoIfhCXbKvC5ixig-accO4kvG8-oTvQs7dqqi4avGuqrimxppqaACsTDRPRZhMZxB4EGx1p8n8p6lk6opAA\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">lien vers un terrain de jeu TypeScript<\/a> o\u00f9 j&rsquo;ai ajout\u00e9 le code de cet article et l&rsquo;ai comment\u00e9 afin que vous puissiez voir ce qui se passe, en regardant <code>Partial<\/code>, <code>Omit<\/code>et notre type d&rsquo;utilitaire g\u00e9n\u00e9rique.<\/p>\n<p>Le monde des g\u00e9n\u00e9riques et des utilitaires est fantastique dans TypeScript. Lancez-vous et commencez \u00e0 exp\u00e9rimenter !<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/startfunction.com\" class=\"external external_icon\">startfunction.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Utilisez Partial &#038; Omit pour ne rendre facultatives que certaines propri\u00e9t\u00e9s d&rsquo;un type.<\/p>\n","protected":false},"author":1,"featured_media":236900,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,728,748,841,862],"tags":[1167],"class_list":["post-232057","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-javascript-3","category-open-source-projektmanagement-2","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/232057","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=232057"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/232057\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/236900"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=232057"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=232057"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=232057"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}