{"id":21454,"date":"2025-09-03T10:00:03","date_gmt":"2025-09-03T15:00:03","guid":{"rendered":"http:\/\/carterembry.com\/?p=21454"},"modified":"2025-09-03T11:27:37","modified_gmt":"2025-09-03T16:27:37","slug":"adopting-typescript-at-scale","status":"publish","type":"post","link":"https:\/\/carterembry.com\/it\/2025\/adopting-typescript-at-scale\/%20","title":{"rendered":"Adottare TypeScript in scala (o cambiare le ruote di un autobus in movimento)"},"content":{"rendered":"<div id=\"pl-21454\"  class=\"panel-layout\" ><div id=\"pg-21454-0\"  class=\"panel-grid panel-no-style\" ><div id=\"pgc-21454-0-0\"  class=\"panel-grid-cell\" ><div id=\"panel-21454-0-0-0\" class=\"so-panel widget widget_sow-editor panel-first-child panel-last-child\" data-index=\"0\" ><div\n\t\t\t\n\t\t\tclass=\"so-widget-sow-editor so-widget-sow-editor-base\"\n\t\t\t\n\t\t>\n<div class=\"siteorigin-widget-tinymce textwidget\">\n\t<p>Ciao amici! Sono io, Daniel.<\/p>\n<p>Se mi conosci nella vita reale, probabilmente mi hai sentito blaterare a lungo su qualcosa che riguarda JavaScript. Il mio primo lavoro di programmazione professionale \u00e8 stato quasi tutto in Vanilla JavaScript, quindi amo JS da molto tempo. A differenza di altri, trovo le sue stranezze ed eccentricit\u00e0 accattivanti. L'ereditariet\u00e0 prototipale \u00e8 un po' stravagante all'inizio, ma in realt\u00e0 \u00e8 piuttosto semplice per le esigenze quotidiane. Ho visto molte mode andare e venire (guardando Coffeescript). Detto questo, mi ci \u00e8 voluto molto tempo per salire sul treno di Typescript. Ma ora che sono qui? Sono <strong>TUTTI IN<\/strong>.<\/p>\n<\/div>\n<\/div><\/div><\/div><\/div><div id=\"pg-21454-1\"  class=\"panel-grid panel-no-style\" ><div id=\"pgc-21454-1-0\"  class=\"panel-grid-cell\" ><div id=\"panel-21454-1-0-0\" class=\"so-panel widget widget_sow-editor panel-first-child panel-last-child\" data-index=\"1\" ><div\n\t\t\t\n\t\t\tclass=\"so-widget-sow-editor so-widget-sow-editor-base\"\n\t\t\t\n\t\t>\n<div class=\"siteorigin-widget-tinymce textwidget\">\n\t<p>I <em>amore<\/em> Typescript. Puoi stabilire contratti chiaramente comprensibili per le tue strutture di dati, funzioni e classi e farli rispettare in fase di compilazione. Ci\u00f2 significa che se qualcuno usa in modo improprio qualcosa o se un contratto\/interfaccia cambia, viene catturato. <strong>prima di<\/strong> e di danneggiare i tuoi utenti. <em>\u00c8 un codice che spiega come deve essere utilizzato.<\/em> Cosa c'\u00e8 di non bello in questo? Stavo gi\u00e0 pensando a JS in questo modo, perch\u00e9 non aggiungere un livello per spiegare i miei pensieri? Questa soluzione \u00e8 ideale per i team o per le funzioni trasversali, ma anche per il futuro (dopo che avr\u00f2 dormito e dimenticato tutto).<\/p>\n<p>Nel mio lavoro diurno usiamo Typescript<span class=\"BxUVEf ILfuVd\" lang=\"en\"><span class=\"hgKElc\">Ma non \u00e8 sempre stato cos\u00ec. Lavoro in un'applicazione che \u00e8 <strong>mumble-mumble<\/strong> con molte generazioni di codice: dai tempi di React basato sulle classi con Redux+Thunks ai pi\u00f9 moderni componenti funzionali basati su React Hooks. \u00c8 come scavare tra i sedimenti rocciosi per scoprire i motivi storici. Tutto ci\u00f2 che \u00e8 nuovo \u00e8 scritto in Typescript e questo \u00e8 fantastico, ma non ci ha aiutato quando abbiamo dovuto scavare pi\u00f9 a fondo nelle vecchie funzionalit\u00e0 (o *gasp* ripulire i debiti). Man mano che ci rendevamo conto della gioia di usare i nuovi componenti (e del dolore di usare quelli vecchi), volevo arrivarci pi\u00f9 velocemente. Volevo vivere nel futuro, non nel passato.<\/span><\/span><\/p>\n<h3>Entrare <a href=\"https:\/\/github.com\/airbnb\/ts-migrate\">Il comodissimo strumento di AirBnB, ts-migrate.<\/a><\/h3>\n<\/div>\n<\/div><\/div><\/div><div id=\"pgc-21454-1-1\"  class=\"panel-grid-cell\" ><div id=\"panel-21454-1-1-0\" class=\"so-panel widget widget_sow-image panel-first-child\" data-index=\"2\" ><div\n\t\t\t\n\t\t\tclass=\"so-widget-sow-image so-widget-sow-image-default-8b5b6f678277-21454\"\n\t\t\t\n\t\t>\n<div class=\"sow-image-container\">\n\t\t<img \n\tsrc=\"https:\/\/carterembry.com\/wp-content\/uploads\/2025\/08\/typescript_over_javascript.jpg\" width=\"750\" height=\"500\" srcset=\"https:\/\/carterembry.com\/wp-content\/uploads\/2025\/08\/typescript_over_javascript.jpg 750w, https:\/\/carterembry.com\/wp-content\/uploads\/2025\/08\/typescript_over_javascript-200x133.jpg 200w, https:\/\/carterembry.com\/wp-content\/uploads\/2025\/08\/typescript_over_javascript-18x12.jpg 18w, https:\/\/carterembry.com\/wp-content\/uploads\/2025\/08\/typescript_over_javascript-272x182.jpg 272w, https:\/\/carterembry.com\/wp-content\/uploads\/2025\/08\/typescript_over_javascript-720x480.jpg 720w\" sizes=\"(max-width: 750px) 100vw, 750px\" alt=\"Meme di una coppia che cammina insieme. L&#039;altro uomo ha la scritta &quot;Javascript&quot;, mentre l&#039;altra donna ha la scritta &quot;Typescript&quot;. L&#039;uomo si guarda alle spalle e guarda l&#039;altra donna (Typescript) per indicare che ha attirato la sua attenzione.\" \t\tclass=\"so-widget-image\" loading=\"lazy\" \/>\n\t<\/div>\n\n<\/div><\/div><div id=\"panel-21454-1-1-1\" class=\"so-panel widget widget_sow-editor panel-last-child\" data-index=\"3\" ><div\n\t\t\t\n\t\t\tclass=\"so-widget-sow-editor so-widget-sow-editor-base\"\n\t\t\t\n\t\t>\n<div class=\"siteorigin-widget-tinymce textwidget\">\n\t<blockquote class=\"quote\">\n<p>Volevo arrivare pi\u00f9 velocemente. Volevo vivere nel futuro, non nel passato.<\/p>\n<\/blockquote>\n<\/div>\n<\/div><\/div><\/div><\/div><div id=\"pg-21454-2\"  class=\"panel-grid panel-no-style\" ><div id=\"pgc-21454-2-0\"  class=\"panel-grid-cell\" ><div id=\"panel-21454-2-0-0\" class=\"so-panel widget widget_sow-editor panel-first-child panel-last-child\" data-index=\"4\" ><div class=\"panel-widget-style panel-widget-style-for-21454-2-0-0\" ><div\n\t\t\t\n\t\t\tclass=\"so-widget-sow-editor so-widget-sow-editor-base\"\n\t\t\t\n\t\t>\n<div class=\"siteorigin-widget-tinymce textwidget\">\n\t<p>Questo strumento eccezionale analizza l'intera base di codice, convertendo tutti i file di <strong>.js(x)<\/strong> file a\u00a0<strong>.ts(x)<\/strong>.<\/p>\n<p>Lo so, lo so, sembra una cosa sporca. Si imposta l'utilizzo del temuto <strong>qualsiasi<\/strong> tipo di dato, <a href=\"https:\/\/www.allthingstypescript.dev\/p\/why-avoid-the-any-type-in-typescript\">che \u00e8 un no preferenziale<\/a>. Nei punti in cui non riesce a determinare come i tipi debbano interagire, inserisce un commento che dice a Typescript di ignorare la riga successiva. Ancora una volta, lo so, lo so, questo non \u00e8 meno sporco.<\/p>\n<p>MA ascolta. Questi file JS si comportano gi\u00e0 essenzialmente in questo modo. Non ci sono tipi, quindi ogni cosa \u00e8 gi\u00e0 un file <strong>qualsiasi.<\/strong><\/p>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div><\/div><\/div><\/div><\/div><div id=\"pg-21454-3\"  class=\"panel-grid panel-has-style\" ><div class=\"panel-row-style panel-row-style-for-21454-3\" ><div id=\"pgc-21454-3-0\"  class=\"panel-grid-cell\" ><div id=\"panel-21454-3-0-0\" class=\"so-panel widget widget_sow-editor panel-first-child panel-last-child\" data-index=\"5\" ><div class=\"panel-widget-style panel-widget-style-for-21454-3-0-0\" ><div\n\t\t\t\n\t\t\tclass=\"so-widget-sow-editor so-widget-sow-editor-base\"\n\t\t\t\n\t\t>\n<div class=\"siteorigin-widget-tinymce textwidget\">\n\t<h3>Quindi, a prescindere dal problema, questo ha almeno due vantaggi strategici immediati:<\/h3>\n<ol>\n<li style=\"text-align: left;\">L'integrazione di nuovi componenti in quelli vecchi \u00e8 ora sicura dal punto di vista del tipo. Prima di questa modifica, era come se si trattasse di un vecchio JS quando dovevamo inserirli in un vecchio codice.\n<ul>\n<li>Questo significa che ora il nostro nuovo codice Typescript sta tirando su la qualit\u00e0 di questi vecchi file piuttosto che i vecchi file tirano gi\u00f9 l'intera base di codice.<\/li>\n<\/ul>\n<\/li>\n<li>Ogni singolo punto che necessita di attenzione per essere davvero pronto per Typescript \u00e8 ora contrassegnato da un commento o da un <strong>qualsiasi<\/strong> tipo di dato. Cerchiamo di ripulire ogni vecchio file che viene toccato, un file alla volta. Enumerare l'entit\u00e0 di un problema pu\u00f2 richiedere molto tempo: con questo approccio, invece, \u00e8 gi\u00e0 fatto.<\/li>\n<\/ol>\n<\/div>\n<\/div><\/div><\/div><\/div><div id=\"pgc-21454-3-1\"  class=\"panel-grid-cell\" ><div id=\"panel-21454-3-1-0\" class=\"so-panel widget widget_sow-editor panel-first-child panel-last-child\" data-index=\"6\" ><div\n\t\t\t\n\t\t\tclass=\"so-widget-sow-editor so-widget-sow-editor-base\"\n\t\t\t\n\t\t>\n<div class=\"siteorigin-widget-tinymce textwidget\">\n\t<blockquote class=\"quote\"><p>\u00c8 un codice che spiega come deve essere usato. Cosa c'\u00e8 di non bello in questo?<\/p><\/blockquote>\n<\/div>\n<\/div><\/div><\/div><\/div><\/div><div id=\"pg-21454-4\"  class=\"panel-grid panel-has-style\" ><div class=\"panel-row-style panel-row-style-for-21454-4\" ><div id=\"pgc-21454-4-0\"  class=\"panel-grid-cell\" ><div id=\"panel-21454-4-0-0\" class=\"so-panel widget widget_sow-editor panel-first-child panel-last-child\" data-index=\"7\" ><div\n\t\t\t\n\t\t\tclass=\"so-widget-sow-editor so-widget-sow-editor-base\"\n\t\t\t\n\t\t>\n<div class=\"siteorigin-widget-tinymce textwidget\">\n\t<p>So che per alcuni di voi la sensazione di \"sporcizia\" rimarr\u00e0, ma vi dico che... <strong>la tua vita sar\u00e0 migliore per questo.<\/strong> Il nostro \u00e8 decisamente migliore. Siamo stati in grado di non accettare i file JS, forzando cos\u00ec ulteriormente l'adozione. Abbiamo un elenco chiaro dei nostri debiti JS rimanenti. E la pulizia dei vecchi file \u00e8 diventata un'aggiunta facile al lavoro esistente, anzich\u00e9 un problema insormontabile.<\/p>\n<p>I vantaggi positivi superano di gran lunga le preoccupazioni legate al disordine creato da un processo automatizzato. Questo non era chiaro prima che lo usassimo, ma \u00e8 chiarissimo col senno di poi. Non \u00e8 sempre cos\u00ec?<\/p>\n<p>Abbraccia il futuro: ci vuole solo un po' di tempo e non te ne pentirai.<\/p>\n<\/div>\n<\/div><\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Ciao amici! Sono io, Daniel. Se mi conosci di persona, probabilmente mi hai sentito blaterare a lungo su qualcosa che riguarda JavaScript. Il mio primo lavoro di programmazione professionale \u00e8 stato quasi tutto in Vanilla JavaScript, quindi amo JS da molto tempo. A differenza di altri, trovo le sue stranezze ed eccentricit\u00e0 accattivanti. L'ereditariet\u00e0 prototipale \u00e8 un po' stramba [...]<\/p>","protected":false},"author":3,"featured_media":21459,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"wprm-recipe-roundup-name":"","wprm-recipe-roundup-description":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"default","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[10,5,7],"tags":[],"class_list":["post-21454","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-about-daniel","category-professional-opinions","category-technical-jargon"],"_links":{"self":[{"href":"https:\/\/carterembry.com\/it\/wp-json\/wp\/v2\/posts\/21454","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/carterembry.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/carterembry.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/carterembry.com\/it\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/carterembry.com\/it\/wp-json\/wp\/v2\/comments?post=21454"}],"version-history":[{"count":24,"href":"https:\/\/carterembry.com\/it\/wp-json\/wp\/v2\/posts\/21454\/revisions"}],"predecessor-version":[{"id":21482,"href":"https:\/\/carterembry.com\/it\/wp-json\/wp\/v2\/posts\/21454\/revisions\/21482"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/carterembry.com\/it\/wp-json\/wp\/v2\/media\/21459"}],"wp:attachment":[{"href":"https:\/\/carterembry.com\/it\/wp-json\/wp\/v2\/media?parent=21454"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/carterembry.com\/it\/wp-json\/wp\/v2\/categories?post=21454"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/carterembry.com\/it\/wp-json\/wp\/v2\/tags?post=21454"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}