{"id":232328,"date":"2023-01-08T12:16:00","date_gmt":"2023-01-08T09:16:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232328"},"modified":"2022-11-10T08:46:15","modified_gmt":"2022-11-10T05:46:15","slug":"typescript-proprieta-selezionate-facoltative-con-parziale-ometti","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/typescript-proprieta-selezionate-facoltative-con-parziale-ometti\/","title":{"rendered":"TypeScript: propriet\u00e0 selezionate facoltative con Parziale &#038; Ometti"},"content":{"rendered":"\n<p>Quando si utilizza l&#8217;utilit\u00e0 <code>Partial<\/code>su un tipo, tutte le propriet\u00e0 del tipo saranno facoltative. Vediamo come possiamo comporre questa utility con un&#8217;altra, <code>Omit<\/code>, per rendere opzionali solo alcune propriet\u00e0 di questo tipo. Creeremo infine un tipo di utilit\u00e0 utilizzando i generici TypeScript per applicarlo a qualsiasi tipo desideriamo.<\/p>\n<h2>Rendi facoltative tutte le propriet\u00e0 di un tipo<\/h2>\n<p>Le utilit\u00e0 <code>Partial<\/code>e <code>Omit<\/code>sono ben note nel regno di <a href=\"https:\/\/startfunction.com\/tag\/typescript\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">TypeScript<\/a> perch\u00e9 sono molto utili per applicarle rapidamente a un tipo e ottenere quello che \u00e8 fondamentalmente un nuovo tipo. <code>Partial&lt;T&gt;<\/code>convertir\u00e0 tutte le chiavi di un tipo in facoltative. Se ad esempio hai questo tipo:<\/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>tutte le propriet\u00e0 sono richieste quando qualcosa ha questo tipo. Se vuoi assegnare un oggetto come questo:<\/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>fallir\u00e0 perch\u00e9 manca la <code>keyboard<\/code>propriet\u00e0. Ora, potremmo contrassegnare questa propriet\u00e0 come opzionale e TypeScript ce lo consente facilmente. Il modo pi\u00f9 semplice per farlo \u00e8 aggiungere un punto interrogativo al suo nome. In questo caso, se \u00e8 possibile modificare il tipo originale, puoi accedervi e modificarlo in questo modo:<\/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>Grande. Ora l&#8217;assegnazione precedente andr\u00e0 a buon fine perch\u00e9 <code>keyboard<\/code>non \u00e8 pi\u00f9 richiesta. Ma cosa succede se non \u00e8 possibile cambiare il tipo originale per qualsiasi motivo? Quello che puoi fare rapidamente in questi casi \u00e8 applicare <code>Partial<\/code>a questo tipo:<\/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>Ci\u00f2 interrompe l&#8217;applicazione di tutte le propriet\u00e0, rendendole tutte facoltative. Forse a volte lo vogliamo, ma cosa succede se vogliamo solo rendere opzionale una sola propriet\u00e0 ed evitare di modificare il tipo originale?<\/p>\n<h2>Rimozione di propriet\u00e0 da un tipo<\/h2>\n<p>Prima di passare ad esso e vedere come funziona, vediamo un&#8217;altra utility che ci aiuter\u00e0 in questo: <code>Omit<\/code>. Questo tipo di utilit\u00e0 rimuove le propriet\u00e0 dal tipo a cui \u00e8 applicato. Sebbene <code>Partial<\/code>non accetti altri argomenti oltre al tipo, <code>Omit<\/code>prende il tipo pi\u00f9 le propriet\u00e0 che desideri rimuovere: <code>Omit&lt;T, K&gt;<\/code>.<\/p>\n<p>Non \u00e8 <code>Partial<\/code>che li renda opzionali: <code>Omit<\/code>li canceller\u00e0 completamente dal tipo. Quando lo usi <code>Partial&lt;Band&gt;<\/code>\u00e8 come se avessi fatto questo:<\/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>Tuttavia, quando usi <code>Omit&lt;Band, 'keyboard'&gt;<\/code>, \u00e8 come se avessi fatto questo:<\/p>\n<pre><code>interface Band {\n    lead: string\n    guitar: string\n    bass: string\n    drums: string\n}<\/code><\/pre>\n<p>Questo ora sta iniziando ad avere senso, giusto? Riesci a immaginare cosa potremmo fare in TypeScript se avessimo un tipo che ha tutte le propriet\u00e0 dell&#8217;originale impostate su opzionali e un altro tipo che ha solo le propriet\u00e0 che vogliamo richiedere? Se solo ci fosse un modo per&#8230; intersecare questi tipi, giusto?<\/p>\n<h2>Tipi intersecanti<\/h2>\n<p>S\u00ec, c&#8217;\u00e8 un modo in TypeScript usando la e commerciale <code>&amp;<\/code>, l&#8217;operatore di intersezione del tipo. Questo operatore, dati due tipi, ne costruisce uno nuovo con le propriet\u00e0 che appartengono a entrambi i tipi:<\/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>A questo punto probabilmente l&#8217;hai capito: incroceremo un tipo parzializzato e un tipo in cui abbiamo rimosso alcune delle sue propriet\u00e0.<\/p>\n<h2>Rendi facoltative le propriet\u00e0 selezionate di un tipo<\/h2>\n<p>Proviamo a dargli un senso. \u00c8 importante quando si impara TypeScript per razionalizzare ci\u00f2 che sta accadendo con i nostri tipi.<\/p>\n<p>Prenderemo un tipo che ha tutte le sue propriet\u00e0 impostate su facoltative grazie <code>Partial<\/code>all&#8217;applicazione su di esso. Successivamente, lo intersecheremo con un tipo che ha selezionato le propriet\u00e0 rimosse da <code>Omit<\/code>. Vediamo un esempio:<\/p>\n<pre><code>interface SomeType {\n    propA: string\n    propB: number\n}\n\ntype OptionalPropB = Partial &amp; Omit<\/code><\/pre>\n<p>Ora abbiamo un nuovo tipo, senza modificare il tipo originale, che assomiglia al seguente:<\/p>\n<pre><code>type OptionalPropB = {\n    propA: string\n    propB?: string\n}<\/code><\/pre>\n<p>Ci\u00f2 accade perch\u00e9 estraiamo propriet\u00e0 <code>propA?<\/code>e <code>propB?<\/code>dal tipo prodotto da <code>Partial<\/code>e le intersechiamo con <code>propA<\/code>il tipo prodotto da <code>Omit<\/code>.<\/p>\n<h2>Utilit\u00e0 generiche TypeScript<\/h2>\n<p>Ok, ora il nostro nuovo tipo funziona e possiamo avere solo le propriet\u00e0 selezionate contrassegnate come opzionali senza modificare il tipo originale. Tuttavia, questa linea<\/p>\n<pre><code>type OptionalPropB = Partial &amp; Omit<\/code><\/pre>\n<p>\u00c8 troppo prolisso, piuttosto brutto e noioso da scrivere ogni volta. Ancora pi\u00f9 importante, non funzioner\u00e0 con un tipo diverso, dovremo scriverlo di nuovo ogni volta. Possiamo renderlo pi\u00f9 corto e pi\u00f9 carino e farlo funzionare per qualsiasi tipo? S\u00ec, TypeScript ci consente di utilizzare qui i generici e creare il nostro tipo di utilit\u00e0:<\/p>\n<pre><code>type Optional = Partial &amp; Omit<\/code><\/pre>\n<p>E ora abbiamo il nostro tipo di utilit\u00e0 TypeScript implementato con generici che possiamo utilizzare per rendere le propriet\u00e0 del tipo selezionato opzionali in qualsiasi tipo. Possiamo usarlo in questo modo:<\/p>\n<pre><code>type TypeWithOptionalProp = Optional<\/code><\/pre>\n<p>Noterai che la firma \u00e8 simile a Omit: questa utility prende il tipo su cui operare e le propriet\u00e0 che saranno rese opzionali. Se ne hai di pi\u00f9, puoi utilizzare l&#8217;operatore union:<\/p>\n<pre><code>type TypeWithOptionalProps = Optional<\/code><\/pre>\n<h2>Parole di chiusura<\/h2>\n<p>Ora puoi salvare questo tipo di utilit\u00e0 generico in un file ed esportarlo per usarlo nell&#8217;intera app. Ecco 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\">collegamento a un playground TypeScript<\/a> in cui ho aggiunto il codice di questo articolo e l&#8217;ho commentato in modo che tu possa vedere cosa sta succedendo, guardando <code>Partial<\/code>, <code>Omit<\/code>e il nostro tipo di utilit\u00e0 generico.<\/p>\n<p>Il mondo dei generici e dei programmi di utilit\u00e0 \u00e8 fantastico in TypeScript. Entra e inizia a sperimentare!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/startfunction.com\" class=\"external external_icon\">startfunction.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Utilizzare Parziale e ometti per rendere facoltative solo alcune propriet\u00e0 di un tipo.<\/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":[896,731,751,720,844,865],"tags":[1168],"class_list":["post-232328","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-javascript-6","category-open-source-projektmanagement-3","category-sviluppatore","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/232328","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=232328"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/232328\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/236900"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=232328"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=232328"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=232328"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}