{"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\/fr\/2025\/adopting-typescript-at-scale\/%20","title":{"rendered":"Adopter TypeScript \u00e0 l'\u00e9chelle (ou changer les roues d'un bus en marche)."},"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>Salut les amis ! C'est moi, Daniel.<\/p>\n<p>Si tu me connais IRL, tu m'as probablement d\u00e9j\u00e0 entendu parler longuement de quelque chose en rapport avec JavaScript. Mon premier travail de programmation professionnelle \u00e9tait presque enti\u00e8rement consacr\u00e9 \u00e0 Vanilla JavaScript, alors j'aime JS depuis longtemps. Contrairement \u00e0 d'autres, je trouve ses bizarreries et ses excentricit\u00e9s attachantes. L'h\u00e9ritage prototypique est un peu farfelu au d\u00e9but, mais il est en fait assez simple pour les besoins quotidiens. J'ai vu beaucoup de modes aller et venir (je te regarde, Coffeescript). Cela dit, il m'a fallu beaucoup de temps pour prendre le train Typescript en marche. Mais maintenant que j'y suis ? Je suis <strong>TOUT LE MONDE S'EN M\u00caLE<\/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>amour<\/em> Typescript. Tu peux \u00e9tablir des contrats clairement compr\u00e9hensibles pour tes structures de donn\u00e9es, tes fonctions et tes classes, puis les appliquer au moment de la compilation. Cela signifie que si quelqu'un fait un mauvais usage de quelque chose, ou si un contrat ou une interface change, cela est pris en compte <strong>avant<\/strong> et de nuire \u00e0 tes utilisateurs. <em>C'est un code qui explique comment il est cens\u00e9 \u00eatre utilis\u00e9.<\/em> Qu'est-ce qui ne te pla\u00eet pas dans tout \u00e7a ? Je pensais d\u00e9j\u00e0 \u00e0 la JS de cette fa\u00e7on, pourquoi ne pas ajouter une couche pour expliquer mes pens\u00e9es ? Cela brille vraiment pour les \u00e9quipes ou la transversalit\u00e9, mais c'est aussi g\u00e9nial pour le futur-moi (apr\u00e8s que j'ai dormi et tout oubli\u00e9).<\/p>\n<p>Nous utilisons Typescript dans mon travail de jour<span class=\"BxUVEf ILfuVd\" lang=\"en\"><span class=\"hgKElc\">\u2122 mais il n'en a pas toujours \u00e9t\u00e9 ainsi. Je travaille dans une application qui est <strong>mumble-mumble<\/strong> ans avec de nombreuses g\u00e9n\u00e9rations de code - depuis l'\u00e9poque de React bas\u00e9 sur les classes avec Redux+Thunks jusqu'aux composants fonctionnels plus modernes bas\u00e9s sur React Hooks. C'est comme creuser dans des couches de s\u00e9diments rocheux pour d\u00e9couvrir le pourquoi et le comment historiques. Tout ce qui est nouveau est \u00e9crit en Typescript et \u00e7a fait du bien - mais \u00e7a n'a pas aid\u00e9 quand nous avons d\u00fb creuser plus profond\u00e9ment dans les anciennes fonctionnalit\u00e9s (ou *gasp* nettoyer la dette). Alors que nous r\u00e9alisions la joie d'utiliser nos nouveaux composants (et la douleur d'utiliser les anciens), je voulais y arriver plus rapidement. Je voulais vivre dans le futur, pas dans le pass\u00e9.<\/span><\/span><\/p>\n<h3>Entrer <a href=\"https:\/\/github.com\/airbnb\/ts-migrate\">L'outil incroyablement pratique d'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=\"M\u00e8me d&#039;un couple marchant ensemble. Sa moiti\u00e9 porte l&#039;inscription &quot;Javascript&quot;, tandis que l&#039;autre femme porte l&#039;inscription &quot;Typescript&quot;. L&#039;homme regarde l&#039;autre femme (Typescript) par-dessus son \u00e9paule, ce qui indique qu&#039;elle a attir\u00e9 son attention.\" \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>Je voulais arriver plus vite. Je voulais vivre dans le futur, pas dans le pass\u00e9.<\/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>Cet outil radical passera en revue l'ensemble de ta base de code, en convertissant tous les \u00e9l\u00e9ments de ta base de code. <strong>.js(x)<\/strong> fichiers \u00e0\u00a0<strong>.ts(x)<\/strong>.<\/p>\n<p>Je sais, je sais, c'est un peu sale. Il utilise par d\u00e9faut le redoutable <strong>n'importe laquelle<\/strong> type de donn\u00e9es, <a href=\"https:\/\/www.allthingstypescript.dev\/p\/why-avoid-the-any-type-in-typescript\">ce qui est une interdiction pr\u00e9f\u00e9rentielle<\/a>. Aux endroits o\u00f9 il ne peut pas d\u00e9terminer comment les types doivent interagir, il ins\u00e8re un commentaire indiquant \u00e0 Typescript d'ignorer la ligne suivante. Encore une fois, je sais, je sais, ce n'est pas moins sale.<\/p>\n<p>MAIS \u00e9coute. Ces fichiers JS se comportent d\u00e9j\u00e0 essentiellement de cette fa\u00e7on. Il n'y a pas de types, donc tout est d\u00e9j\u00e0 un <strong>n'importe laquelle.<\/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>Donc, ind\u00e9pendamment de l'irritation, cela pr\u00e9sente au moins deux avantages strat\u00e9giques imm\u00e9diats :<\/h3>\n<ol>\n<li style=\"text-align: left;\">L'int\u00e9gration de nouveaux composants dans d'anciens composants est maintenant s\u00e9curis\u00e9e. Avant ce changement, ils auraient tout aussi bien pu \u00eatre du bon vieux JS lorsque nous devions les int\u00e9grer dans du vieux code.\n<ul>\n<li>Cela signifie que notre nouveau code Typescript tire vers le haut la qualit\u00e9 de ces anciens fichiers plut\u00f4t que les anciens fichiers tirent vers le bas l'ensemble de la base de code.<\/li>\n<\/ul>\n<\/li>\n<li>Chaque endroit qui n\u00e9cessite de l'attention pour \u00eatre vraiment pr\u00eat pour Typescript est maintenant marqu\u00e9 par un commentaire ou un <strong>n'importe laquelle<\/strong> type de donn\u00e9es. Nous essayons de nettoyer tous les vieux fichiers qui sont touch\u00e9s, un fichier \u00e0 la fois. L'\u00e9num\u00e9ration de l'ampleur d'un probl\u00e8me peut elle-m\u00eame prendre du temps - avec cette approche, c'est d\u00e9j\u00e0 fait.<\/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>C'est un code qui explique comment il est cens\u00e9 \u00eatre utilis\u00e9. Qu'est-ce qui ne te pla\u00eet pas dans tout \u00e7a ?<\/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>Je sais qu'une partie de ce sentiment \"sale\" persistera pour certains d'entre vous, mais je vous le dis - <strong>Ta vie en sera am\u00e9lior\u00e9e.<\/strong> Le n\u00f4tre est d\u00e9finitivement meilleur. Nous avons pu interdire les fichiers JS, ce qui a permis de forcer davantage l'adoption. Nous avons une \u00e9num\u00e9ration claire de notre dette JS restante. Et le nettoyage des anciens fichiers est devenu un ajout facile au travail existant plut\u00f4t qu'un g\u00e2chis insurmontable.<\/p>\n<p>Les avantages l'emportent largement sur les inqui\u00e9tudes concernant le d\u00e9sordre cr\u00e9\u00e9 par un processus automatis\u00e9. Ce n'\u00e9tait pas clair avant que nous l'utilisions, mais c'est clair comme de l'eau de roche avec le recul. N'est-ce pas toujours le cas ?<\/p>\n<p>Embrasse l'avenir - cela ne prend qu'un peu de temps et tu ne le regretteras pas.<\/p>\n<\/div>\n<\/div><\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Salut les amis ! C'est moi, Daniel. Si tu me connais IRL, tu m'as probablement d\u00e9j\u00e0 entendu parler longuement de quelque chose en rapport avec JavaScript. Mon premier travail de programmation professionnelle \u00e9tait presque enti\u00e8rement consacr\u00e9 \u00e0 Vanilla JavaScript, alors j'aime JS depuis longtemps. Contrairement \u00e0 d'autres, je trouve ses bizarreries et ses excentricit\u00e9s attachantes. L'h\u00e9ritage prototypique est un peu farfelu [...]<\/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\/fr\/wp-json\/wp\/v2\/posts\/21454","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/carterembry.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/carterembry.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/carterembry.com\/fr\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/carterembry.com\/fr\/wp-json\/wp\/v2\/comments?post=21454"}],"version-history":[{"count":24,"href":"https:\/\/carterembry.com\/fr\/wp-json\/wp\/v2\/posts\/21454\/revisions"}],"predecessor-version":[{"id":21482,"href":"https:\/\/carterembry.com\/fr\/wp-json\/wp\/v2\/posts\/21454\/revisions\/21482"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/carterembry.com\/fr\/wp-json\/wp\/v2\/media\/21459"}],"wp:attachment":[{"href":"https:\/\/carterembry.com\/fr\/wp-json\/wp\/v2\/media?parent=21454"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/carterembry.com\/fr\/wp-json\/wp\/v2\/categories?post=21454"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/carterembry.com\/fr\/wp-json\/wp\/v2\/tags?post=21454"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}