paint-brush
Cómo migrar un proyecto de React de JavaScript a TypeScriptpor@leandronnz
15,645 lecturas
15,645 lecturas

Cómo migrar un proyecto de React de JavaScript a TypeScript

por Leandro Nuñez24m2023/10/19
Read on Terminal Reader

Demasiado Largo; Para Leer

Migrar un proyecto React de Javascript a TypeScript no es una simple "buscar y reemplazar" archivos .js con .tsx. Es un movimiento estratégico que implica aprender nuevas convenciones, comprender los tipos en profundidad y, lo más importante, cambiar la forma en que pensamos sobre la confiabilidad y coherencia de nuestro código. Aquí hay algunas notas: Red de seguridad: TypeScript ha introducido una capa de seguridad en nuestro proyecto, detectando errores antes de que causen estragos en tiempo de ejecución. Esta red de seguridad, una vez que te acostumbras, cambia las reglas del juego en términos de confianza en tu código y velocidad general de desarrollo. Comunicación más clara: con los tipos, nuestro código ahora se comunica de manera más explícita. Ya sea que usted esté revisando su código o un nuevo miembro del equipo que intente comprender las estructuras de sus componentes, TypeScript sirve como una capa de documentación adicional. Confianza en la refactorización: ¿Miedo a la refactorización? Bueno, TypeScript te respalda. Dado que los tipos garantizan contratos dentro de su código, se detectan muchos errores potenciales durante las fases de refactorización, lo que hace que el proceso sea menos desalentador. Comunidad y ecosistema: adoptar TypeScript abre las puertas a un ecosistema próspero. Desde bibliotecas escritas en DefinitelyTyped hasta soporte infinito en foros comunitarios y una integración de paquetes de terceros más optimizada, estás en buena compañía. Curva de aprendizaje: Sí, TypeScript introduce una curva de aprendizaje. Probablemente hubo momentos de frustración, confusiones en torno a tipos e interfaces, o luchas con el compilador. Pero mire hacia atrás en su viaje y verá cuánto más comprende su código y su comportamiento ahora.
featured image - Cómo migrar un proyecto de React de JavaScript a TypeScript
Leandro Nuñez HackerNoon profile picture
0-item


Tabla de contenido

  • Introducción

  • ¿Por qué migrar? Comprender los beneficios

  • Antes de comenzar: requisitos previos

  • Iniciando la migración: configurando TypeScript en su proyecto

  • Refactorización de componentes de React

  • API de contexto y gestión de estado

  • Operaciones de enrutamiento y asincrónicas

  • Pruebas en TypeScript

  • Manejo de paquetes que no son TypeScript

  • Mejores prácticas y errores comunes

  • Conclusión

  • Recursos adicionales



Introducción

¡Hola, compañeros desarrolladores! Es emocionante verlo aquí, listo para explorar la transición de JavaScript a TypeScript en nuestros proyectos de React.


Ahora, si ha trabajado con JavaScript, sabrá que es como ese par de zapatos viejos y cómodos: un poco desgastados, a veces impredecibles, pero familiares. TypeScript, sin embargo, es como actualizar un zapato con plantillas personalizadas; es la misma experiencia de caminar pero con apoyo adicional.


Entonces, ¿a qué se debe todo ese rumor sobre TypeScript?


Bueno, es esencialmente JavaScript pero con una buena dosis de capacidades adicionales, la más importante es la verificación de tipos.


Imagínese codificar sin esos molestos errores undefined is not a function que aparecen de la nada. Ese es el tipo de paz que TypeScript trae a tu vida.


En esta guía, explicamos el por qué y el cómo integrar TypeScript en su proyecto React.


¿Por qué reaccionar? Porque es increíble y nos encanta, obviamente. Pero también, combinar el enfoque basado en componentes de React con las funciones de verificación de tipo de TypeScript crea una experiencia de codificación realmente eficiente y agradable.


Aquí hay un adelanto de cómo se ve agregar TypeScript a un proyecto. En un componente típico de JavaScript, tendrías:

 // JavaScript way function Greeting({ name }) { return <h1>Hello, {name}</h1>; }


Con TypeScript, presentamos una forma de garantizar name siempre se trate como una cadena:

 // TypeScript style type Props = { name: string; }; function Greeting({ name }: Props) { return <h1>Hello, {name}</h1>; }


¿Notas la parte type Props ?


Esa es la forma en que TypeScript dice: "Oye, estoy mirando; ¡mejor asegúrate de que name sea una cadena!" Es un cambio simple con profundas implicaciones. Ahora tiene un ángel de la guarda que previene activamente los errores relacionados con los tipos, lo que hace que su código sea más robusto y predecible.


Pero eso es sólo un pequeño vistazo. Hay todo un mundo de beneficios y prácticas con TypeScript que desglosaremos en esta guía completa. Desde configurar su entorno hasta refactorizar componentes y accesorios, e incluso las mejores prácticas para evitar errores comunes, tenemos mucho que cubrir. ¡Así que abróchate el cinturón y pongamos este espectáculo en marcha!




¿Por qué migrar? Comprender los beneficios

Si está contemplando el cambio de JavaScript a TypeScript, especialmente en sus proyectos de React , no es el único que se pregunta: "¿Realmente vale la pena molestarse?". La transición del lenguaje de un proyecto completo no es tarea fácil; requiere esfuerzo, aprendizaje y, inicialmente, un poco de productividad ralentizada. Entonces, ¿por qué los desarrolladores hacen el cambio? Analicemos las razones de peso.


1. Detectar errores antes: verificación de tipo estático

La característica principal de TypeScript es su sistema de tipos estáticos. A diferencia de JavaScript, que se escribe dinámicamente, TypeScript le permite especificar tipos para sus variables, parámetros de funciones y valores devueltos. ¿Cuál es el beneficio? Los errores se detectan durante el desarrollo, mucho antes de que el código se acerque a la producción.


Considere un ejemplo simple:

 // In JavaScript function createGreeting(name) { return `Hello, ${name}`; } // You might not catch this typo until runtime const greeting = createGreeting(123); console.log(greeting); // "Hello, 123" - Wait, that's not right!


Ahora, veamos cómo ayuda TypeScript:

 // In TypeScript function createGreeting(name: string): string { return `Hello, ${name}`; } // TypeScript will flag this immediately - '123' is not a string! const greeting = createGreeting(123);


Con TypeScript, ese error de apariencia inocente se habría detectado instantáneamente, lo que garantiza que usted esté al tanto del percance en el momento en que ocurre. De esta manera, el ciclo de retroalimentación se acorta y usted no tendrá que rascarse la cabeza buscando errores extraños en su entorno de producción.


2. Mejorar la calidad y la comprensión del código

La aplicación de la escritura por parte de TypeScript significa que cualquier otro desarrollador (o incluso usted en el futuro) puede comprender de un vistazo qué tipo de datos espera una función y qué devuelve. Esta claridad hace que las bases de código sean más legibles y autodocumentadas.


Imagínese encontrarse con una función de JavaScript escrita por un colega:

 function calculateTotal(items) { // ... complicated logic ... }


Probablemente necesites profundizar en la función o encontrar dónde se usa para comprender qué items deberían estar. Con TypeScript, queda inmediatamente claro:

 type Item = { price: number; quantity: number; }; // Now we know exactly what to expect! function calculateTotal(items: Item[]): number { // ... complicated logic ... }


3. Soporte de editor mejorado

TypeScript lleva la experiencia del desarrollador a un nuevo nivel al mejorar los editores de texto y los IDE con autocompletado, refactorización y depuración mejorados. Esta integración es posible porque TypeScript puede compartir su comprensión de su código con su editor.

Experimentará esto cuando encuentre que su editor sugiera nombres de métodos, proporcione información de parámetros de funciones o le advierta sobre el uso incorrecto de funciones. Es como tener un copiloto que ayuda a navegar por el código con una capa adicional de seguridad.


4. Colaboración más sencilla

En un entorno de equipo, TypeScript brilla al ayudar a hacer cumplir ciertos estándares y estructuras en todo el código base. Cuando varios desarrolladores contribuyen a un proyecto, las estrictas reglas de TypeScript garantizan que todos cumplan con las mismas pautas de codificación, lo que hace que la colaboración sea más fluida. Es un lenguaje común que habla de "calidad y coherencia" en todos los ámbitos.


5. Prepare su código para el futuro

JavaScript está evolucionando y TypeScript pretende estar al tanto de las últimas funciones. Al utilizar TypeScript, puede comenzar a aprovechar la próxima generación de funciones de JavaScript antes de que alcancen la adopción generalizada, lo que garantiza que su proyecto se mantenga moderno y de vanguardia.


En conclusión, migrar a TypeScript no se trata sólo de detectar errores antes; se trata de una mejora integral de su proceso de codificación. Desde una mejor colaboración en equipo hasta la preparación de sus proyectos para el futuro, TypeScript proporciona una base sólida para crear aplicaciones confiables, escalables y mantenibles.


Hacer el cambio puede parecer desalentador al principio, pero con los beneficios expuestos anteriormente, está claro por qué TypeScript se ha convertido en el favorito de muchos desarrolladores de todo el mundo. ¿Listo para sumergirte? ¡Continuemos!



Antes de comenzar: requisitos previos

Muy bien, ¿estás listo para hacer el cambio a TypeScript con tu proyecto React? ¡Gran decisión!


Pero antes de sumergirnos en el proceso real, debemos asegurarnos de que algunas cosas estén en su lugar.

Considere esta nuestra etapa de preparación, donde preparamos todas nuestras herramientas para que el proceso de transición sea tan suave como la mantequilla.


Esto es lo que necesitas tener listo:

1. Proyecto React existente

Lo primero es lo primero, necesita un proyecto React existente. Este proyecto debe ser uno con el que te sientas cómodo experimentando; Si bien el proceso de migración es bastante sencillo, querrás hacerlo en un espacio donde esté bien crear problemas temporales.


 // Here's a simple React functional component in your project export default function Greeting({ name }) { return <h1>Hello, {name}!</h1>; }


Este componente es un buen punto de partida: es funcional, está limpio y podemos ver lo que sucede de un vistazo.

2. Comprensión básica de TypeScript

No es necesario ser un gurú de TypeScript, pero comprender los conceptos básicos hará que esta transición sea mucho más fácil.


Saber definir tipos, interfaces y conocer la diferencia entre type e interface .

Un poco de tarea ayuda mucho, créeme.


 // A sneak peek into TypeScript syntax type Props = { name: string; // defining the 'name' expected to be a string }; // Your component in TypeScript would look like this import React, { FC } from 'react'; interface GreetingProps { name: string; } const Greeting: FC<GreetingProps> = ({ name }) => { return <h1>Hello, {name}!</h1>; } export default Greeting;


¿Ver la diferencia? Ahora estamos siendo explícitos sobre lo que espera Greeting , haciendo que nuestro componente sea más predecible y más fácil de trabajar.


3. Nodo y NPM/Hilo

Su entorno de desarrollo debe tener instalado Node.js porque usaremos npm o yarn para manejar nuestros paquetes. Este requisito es un hecho ya que estás trabajando con React, pero no hay nada de malo en asegurarte, ¿verdad?


 # Check if Node is installed node --version # Check if npm is installed npm --version # Or for yarn yarn --version


Su terminal debería mostrarle las versiones actuales de estas herramientas, confirmando que están todas configuradas y listas para funcionar.


4. Editor de código

Necesitará un editor de código que pueda manejar bien TypeScript. Visual Studio Code es uno de los favoritos de la multitud porque tiene una sólida compatibilidad con TypeScript incorporada, lo que hace que el proceso de desarrollo sea más fluido con finalización inteligente de código y resaltado de errores.


5. Control de versiones

Este paso no es obligatorio, pero es inteligente. Asegúrese de que su proyecto actual esté bajo control de versiones con git. Si algo sale mal (aunque intentaremos asegurarnos de que no sea así), siempre puedes volver a una versión anterior sin perder el sueño.


 # Check if git is installed git --version # If not, you need to initialize version control before proceeding git init git add . git commit -m "Pre-TypeScript commit"


Tener esta red de seguridad significa que puedes experimentar con confianza, sabiendo que tu espalda está cubierta.


¡Eso es todo para nuestros requisitos previos! Ya tienes el proyecto, has repasado algo de TypeScript, tu entorno está listo y tu red de seguridad está en su lugar.


Ahora estamos todos listos para sumergirnos en el proceso de migración. ¡Pongamos la pelota en marcha!



Iniciando la migración: configurando TypeScript en su proyecto Refactorización de componentes de React

Muy bien, ¡a la siguiente fase!


Hemos preparado el escenario con TypeScript, pero ahora tenemos que ensuciarnos las manos.


Es hora de refactorizar nuestros componentes de React. Este paso implica algo más que simplemente cambiar las extensiones de archivo; Necesitamos actualizar el código de nuestro componente para utilizar las funciones de TypeScript y lograr una experiencia de codificación más sólida y sin errores.

¡Vamos a sumergirnos!


1. Cambiar las extensiones de archivos

Primero lo primero, cambiemos el nombre de nuestros archivos componentes. Este proceso implica cambiar la extensión de .js a .tsx para archivos que contienen código JSX.


Así es como puedes hacer esto en masa en el directorio fuente de tu proyecto desde la línea de comando:

 # For Unix-like shells, navigate to your source folder and run: find . -name "*.js" -exec bash -c 'mv "$0" "${0%.js}.tsx"' {} \; # If you're using PowerShell (Windows), navigate to your source folder and run: Get-ChildItem -Filter *.js -Recurse | Rename-Item -NewName { $_.Name -replace '\.js$','.tsx' }


Estos comandos buscan todos los archivos .js en el directorio fuente de su proyecto y les cambian el nombre a .tsx . Es como decirle a tus archivos: "¡Bienvenidos al mundo TypeScript!".


2. Escribir tus componentes

Con nuestros archivos renombrados, abordemos el código. Comenzaremos con un componente funcional simple en JavaScript:

 // Before: MyComponent.js import React from 'react'; function MyComponent({ greeting }) { return <h1>{greeting}, world!</h1>; }


Ahora, refactoricemos esto para usar TypeScript:

 // After: MyComponent.tsx import React, { FC } from 'react'; // Define a type for the component props interface MyComponentProps { greeting: string; } // Use the 'FC' (Functional Component) generic from React, with our props type const MyComponent: FC<MyComponentProps> = ({ greeting }) => { return <h1>{greeting}, world!</h1>; }


¿Qué hicimos aquí?


Definimos una interfaz MyComponentProps para describir los accesorios de nuestro componente, garantizando la seguridad de tipos. Al decir que greeting es una cadena, TypeScript nos gritará si intentamos pasar, digamos, un número. También utilizamos el tipo FC (abreviatura de Functional Component ) de las definiciones de tipos de React, asegurándonos de que TypeScript sepa que es un componente de React.


3. Escribir fuertemente useState y useEffect

Actualicemos aún más nuestros componentes agregando tipos a los estados y efectos, características comunes de los componentes funcionales.


Aquí hay un componente con estado y un efecto:

 // Before: Counter.js import React, { useState, useEffect } from 'react'; function Counter() { const [count, setCount] = useState(0); useEffect(() => { document.title = `You clicked ${count} times`; }); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> ); }


Agreguemos un poco de magia de TypeScript a esto:

 // After: Counter.tsx import React, { useState, useEffect, FC } from 'react'; const Counter: FC = () => { // Declare the 'count' state variable with TypeScript const [count, setCount] = useState<number>(0); useEffect(() => { document.title = `You clicked ${count} times`; }); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(prevCount => prevCount + 1)}> Click me </button> </div> ); }


En nuestro componente refactorizado, le dijimos explícitamente a TypeScript que esperara un number para nuestro estado count .


Este detalle evita errores molestos en los que accidentalmente podríamos terminar con una cadena, un objeto o, Dios no lo quiera, null en lugar del número esperado.


¡Y ahí vamos!


Hemos refactorizado con éxito nuestros componentes de React para usar TypeScript. Al escribir explícitamente nuestros componentes, estados y accesorios, estamos creando una base de código más predecible y fácil de mantener. No sólo estamos codificando; Estamos creando una obra maestra con la precisión que merece.


A continuación, profundizaremos en escenarios más complejos y cómo TypeScript viene a nuestro rescate.



API de contexto y gestión de estado

Ahora, entremos en el meollo de la cuestión de la gestión del estado en React con TypeScript. Si ha utilizado la API de contexto en un proyecto de JavaScript, sabrá que es una característica poderosa para pasar datos a través del árbol de componentes sin tener que pasar accesorios manualmente en cada nivel. En TypeScript, obtenemos el beneficio adicional de una escritura estricta, lo que hace que nuestros datos de contexto sean aún más sólidos y predecibles.


¿Listo para saltar? ¡Vamos!


1. Crear un contexto escrito

Primero, crearemos un nuevo contexto con TypeScript. Este contexto garantizará que cualquier valor predeterminado, valor de proveedor o componente de consumidor coincida con nuestro tipo esperado.


Así es como definirías un contexto básico en JavaScript:

 // Before: DataContext.js import React, { createContext, useState } from 'react'; export const DataContext = createContext(); export const DataProvider = ({ children }) => { const [data, setData] = useState(null); return ( <DataContext.Provider value={{ data, setData }}> {children} </DataContext.Provider> ); };


Ahora, escribamos este contexto usando TypeScript:

 // After: DataContext.tsx import React, { createContext, useState, FC, ReactNode } from 'react'; // First, we define a type for our context's state interface DataContextState { data: any; // Tip: Replace 'any' with the expected type of 'data' setData: (data: any) => void; // And here too, replace 'any' with the actual expected type } // We ensure our createContext() call is typed with the above interface export const DataContext = createContext<DataContextState | undefined>(undefined); // Now, let's create a provider component export const DataProvider: FC<{children: ReactNode}> = ({ children }) => { const [data, setData] = useState<any>(null); // Again, consider replacing 'any' with your actual data type // The context provider now expects a value that matches 'DataContextState' return ( <DataContext.Provider value={{ data, setData }}> {children} </DataContext.Provider> ); };


Lo que hemos hecho aquí es crear una interfaz TypeScript, DataContextState , que escribe estrictamente nuestros datos de contexto. También hemos escrito la función createContext y el componente DataProvider , asegurando que todo, desde las variables de estado hasta los valores de contexto, se alinee con nuestros tipos definidos.


2. Usando el contexto escrito

Ahora que tenemos nuestro DataContext escrito, veamos cómo podemos utilizarlo dentro de un componente.


Necesitaremos usar el gancho useContext , y así es como se hace:

 // ComponentUsingContext.tsx import React, { useContext, FC } from 'react'; import { DataContext } from './DataContext'; const ComponentUsingContext: FC = () => { // Here we're telling TypeScript to expect 'DataContextState' from our context const { data, setData } = useContext(DataContext) ?? {}; // This function would update the context state, triggering re-renders in consuming components const handleUpdateData = () => { const newData = { message: "Hello, TypeScript!" }; // This should match the structure of your data type setData(newData); }; return ( <div> <pre>{JSON.stringify(data, null, 2)}</pre> <button onClick={handleUpdateData}>Update Data</button> </div> ); };


En ComponentUsingContext , accedemos al contexto y esperamos que TypeScript valide que el valor se alinea con DataContextState . Nuestra función handleUpdateData demuestra cómo se puede actualizar el estado compartido: cualquier componente que consuma DataContext se volverá a representar con los nuevos datos cuando se llame a setData .


Al usar TypeScript con Context API, ganamos confianza en que nuestra administración de estado compartida es consistente en toda la aplicación. El compilador detecta cualquier discrepancia entre lo que proporciona nuestro contexto y lo que esperan nuestros componentes. Esta sinergia hace que nuestro código sea más confiable y nuestro proceso de desarrollo más fluido, lo que nos permite evitar categorías enteras de errores que de otro modo podríamos encontrar.


Continúe con el buen trabajo y recuerde: ¡escribir un poco ahora le ahorrará mucha depuración más adelante!



Pruebas de enrutamiento y operaciones asíncronas en TypeScript >

Ahora que hemos visto cómo TypeScript mejora varios aspectos de nuestra aplicación React, es hora de hablar sobre otra área crítica: las pruebas.


Las pruebas son fundamentales para garantizar que nuestra aplicación funcione como se espera, y TypeScript puede hacer que nuestras pruebas sean más confiables y eficientes. Profundicemos en cómo TypeScript desempeña un papel en las pruebas, particularmente en un proyecto de React.


1. Preparando el escenario para las pruebas

Antes de entrar en el código, asegúrese de tener instaladas las bibliotecas necesarias para realizar pruebas en un proyecto de React. Aquí hay una configuración rápida con Jest y React Testing Library, ampliamente utilizados juntos para probar aplicaciones React:

 npm install --save-dev jest @types/jest @testing-library/react @testing-library/jest-dom


Estas bibliotecas proporcionan un entorno sólido para escribir pruebas unitarias y de integración. Ahora, consideremos un escenario del mundo real para mayor claridad.


2. Escenario de prueba del mundo real: componente de saludo del usuario

Imaginemos que tenemos un componente simple en nuestra aplicación que saluda a los usuarios según la hora del día. Es un componente funcional que toma el nombre del usuario como accesorio y la hora actual como estado.


Así es como se vería nuestro componente UserGreeting :

 // UserGreeting.tsx import React, { FC, useState, useEffect } from 'react'; interface UserGreetingProps { name: string; } const UserGreeting: FC<UserGreetingProps> = ({ name }) => { const [currentHour, setCurrentHour] = useState(new Date().getHours()); const [greeting, setGreeting] = useState(''); useEffect(() => { // Determine the time of day and set the appropriate greeting if (currentHour < 12) { setGreeting('Good morning'); } else if (currentHour < 18) { setGreeting('Good afternoon'); } else { setGreeting('Good evening'); } }, [currentHour]); return ( <div> <h1>{greeting}, {name}!</h1> </div> ); } export default UserGreeting;


Ahora, necesitamos escribir pruebas para asegurarnos de que nuestro componente se comporte como se espera en diferentes condiciones. Nuestros casos de prueba confirmarán que se muestra el saludo apropiado según la hora del día.


Así es como podemos escribir estas pruebas usando Jest y React Testing Library:

 // UserGreeting.test.tsx import React from 'react'; import { render, screen } from '@testing-library/react'; import UserGreeting from './UserGreeting'; describe('UserGreeting Component', () => { // Mock date for consistent testing const originalDate = Date; beforeAll(() => { const mockDate = new Date(2023, 10, 17, 14); // 2:00 PM global.Date = jest.fn(() => mockDate) as any; }); afterAll(() => { global.Date = originalDate; // Restore original Date object }); it('displays the correct greeting for the afternoon', () => { render(<UserGreeting name="Jordan" />); // Assert the greeting based on the mocked time of day expect(screen.getByText('Good afternoon, Jordan!')).toBeInTheDocument(); }); // Additional tests would repeat this process for other times of day, // ensuring our component behaves consistently. });


En este script, renderizamos nuestro componente con una hora establecida (simulada como las 2:00 p.m.) y verificamos si genera "Buenas tardes" como se esperaba. Podemos escribir más pruebas para otros momentos del día (mañana, tarde) para asegurarnos de que nuestro componente esté completamente cubierto.


A través de TypeScript, nos aseguramos de que los accesorios que pasamos a nuestros componentes en nuestras pruebas coincidan con los tipos esperados. De esta manera, evitamos tener problemas con accesorios incorrectos que podrían generar falsos negativos en nuestras pruebas, asegurando que nuestras pruebas sean sólidas y confiables.


El uso de TypeScript en las pruebas ayuda a detectar problemas en las primeras etapas del proceso de desarrollo, lo que hace que nuestras aplicaciones sean más sólidas y fáciles de mantener. ¡Es una situación en la que todos ganan! Recuerde, las pruebas consistentes y completas son un sello distintivo del desarrollo de software de alta calidad. ¡Avanza!




Manejo de paquetes que no son TypeScript

Muy bien, abordemos un área que a menudo hace tropezar a la gente cuando cambia a TypeScript en un proyecto de React: lidiar con bibliotecas y paquetes de JavaScript que no están escritos en TypeScript. Es un escenario común; tienes tu proyecto TypeScript en funcionamiento, y luego instalas un paquete de terceros, solo para encontrar que tu compilador TypeScript se queja. No te preocupes; hay soluciones.


1. Encontrando el problema

Este es un escenario típico: estás intentando usar un paquete que no tiene soporte para TypeScript listo para usar y el compilador de TypeScript comienza a arrojar errores como "No se pudo encontrar un archivo de declaración para el módulo 'nombre-módulo'". ¿Suena familiar?


Este problema surge porque TypeScript se basa en definiciones de tipos para comprender la estructura de bibliotecas y paquetes. Si faltan estas definiciones de tipo, TypeScript se pierde un poco. Pero no temas, tenemos estrategias para manejar esto.

2. Usando DefinitelyTyped

Una de las primeras cosas que puede hacer es verificar si la comunidad ha proporcionado definiciones de tipos para el paquete a través de DefinitelyTyped. DefinitelyTyped es un repositorio masivo de definiciones de tipos mantenido por la comunidad.


Así es como verificaría y usaría los tipos de DefinitelyTyped:


  1. Busque definiciones de tipos para su paquete intentando instalarlas usando npm. Las definiciones de tipos en DefinitelyTyped generalmente tienen el prefijo @types/ .
 npm install @types/package-name


Por ejemplo, si estuviera utilizando la biblioteca lodash , ejecutaría:

 npm install @types/lodash


  1. Después de la instalación, no necesita importar los tipos explícitamente en ninguna parte de su proyecto. TypeScript los detectará y usará automáticamente, lo que le permitirá importar y usar bibliotecas como de costumbre, y obtener autocompletado y verificación de tipos.


Pero ¿qué pasa si no hay una definición de tipo disponible en DefinitelyTyped?


3. Elaboración de su propio archivo de declaración

Si DefinitelyTyped no tiene las definiciones de tipo que necesita, es hora de crear un archivo de declaración personalizado. Si bien este enfoque requiere más esfuerzo, garantiza que su proyecto TypeScript funcione sin problemas con la biblioteca JavaScript.


Aquí hay una versión simplificada de lo que podría hacer:


  1. Cree un nuevo archivo con una extensión .d.ts dentro del directorio fuente (o types ) de su proyecto. Esto podría ser algo así como declarations.d.ts .


  2. En este archivo, querrás declarar el módulo y potencialmente delinear la estructura básica que esperas de la biblioteca. Por ejemplo:

 // This is a simplistic type declaration file for a hypothetical package. // We declare the module so TypeScript recognizes it. declare module 'name-of-untyped-package' { // Below, we're declaring a very basic structure. It's saying // there's a function we're expecting to exist, which returns any. // Ideally, you'd want to flesh this out with more specific types // if you know them or as you learn more about the library. export function functionName(arg: any): any; // You can continue to define the shapes of other functions or variables // you expect to exist within the package. The more detailed you are here, // the more helpful your type checking will be. }


Este archivo de declaración hecho en casa no será tan completo como un conjunto completo de definiciones de tipos, pero le dice a TypeScript: "Créame, sé que este módulo existe y proporciona estas funciones/variables". Desde aquí, puede crear definiciones más detalladas según sea necesario.


Recuerde, lidiar con paquetes que no son TypeScript puede ser un poco complicado, pero estas estrategias garantizan que su proyecto TypeScript permanezca sólido y disfrute de la seguridad y previsibilidad de tipos que buscamos. ¡Se trata de esa confianza en tu código base!



Mejores prácticas y errores comunes

Cambiar a TypeScript en su proyecto React no se trata solo de cambiar las extensiones de archivo y agregar anotaciones de tipo. También se trata de adaptar su mentalidad y prácticas de desarrollo para aprovechar al máximo lo que ofrece TypeScript y, al mismo tiempo, evitar los obstáculos comunes. Entonces, analicemos algunas de las mejores prácticas y los errores comunes que puede encontrar durante este viaje.

1. Mejores prácticas

1.1 Apóyate en la inferencia de tipos

Si bien puede resultar tentador anotar todo, uno de los puntos fuertes de TypeScript es su inferencia de tipos. A menudo es innecesario agregar tipos explícitos a cada parte de su código.

 // Instead of this: let x: number = 0; // You can rely on type inference: let x = 0; // TypeScript knows this is a number

El exceso de anotaciones puede hacer que su código sea detallado sin agregar valor. Confíe en TypeScript para inferir tipos cuando pueda.

1.2 Adoptar los tipos de servicios públicos

Los tipos de utilidad proporcionan formas flexibles de manejar tipos en diversos escenarios. Pueden ahorrarle mucho esfuerzo y hacer que el manejo de tipos sea más eficiente.

 // Example of using Partial to make all properties in an object optional function updateProfile(data: Partial<UserProfile>) { // function implementation } // Now you can pass only the parts of UserProfile you need to update updateProfile({ username: "newUserName" }); // This is valid

Partial , Readonly , Pick y otros tipos de utilidades pueden ser increíblemente útiles.

1.3 Usar enumeraciones para conjuntos de constantes conocidos

Cuando tiene una propiedad que solo puede tomar valores específicos, el uso enum puede aclarar su intención y, al mismo tiempo, proporcionar validación de esos valores.

 enum UserRole { Admin = 'ADMIN', User = 'USER', Guest = 'GUEST', } // Now UserRole can only be one of the values defined in the enum function assignRole(role: UserRole) { // function implementation }

1.4 Preferir interfaces para la definición de estructura de objetos

Si bien type y interface a menudo se pueden usar indistintamente, usar interface para definir la estructura de objetos o clases hace que su código sea más legible y proporciona mejores mensajes de error.

 interface UserProfile { username: string; email: string; // More properties... }


2. Errores comunes

2.1 Abusar any

El uso any niega los beneficios de TypeScript al omitir la verificación de tipos. Si bien puede parecer una solución rápida, hace que su código sea menos seguro y predecible.

 // Try to avoid this: let userData: any = fetchData(); // Instead, define a type for the data you expect: let userData: UserProfile = fetchData();

2.2 Ignorar las advertencias del compilador

Las advertencias del compilador de TypeScript están ahí para ayudarle. Ignorar estos puede provocar los mismos tipos de errores y problemas que intenta evitar utilizando TypeScript.

2.3 Perderse en tipos complejos

A veces, en un intento por hacer que los tipos sean precisos, los desarrolladores crean definiciones de tipos increíblemente complejas que son difíciles de entender y mantener. Si sus tipos se están volviendo complicados, podría ser el momento de simplificar o refactorizar su código.

2.4 Olvidar tipos de bibliotecas de terceros

Si está utilizando bibliotecas de terceros, verifique siempre si existen tipos de TypeScript en DefinitelyTyped. No hacerlo puede significar perder funciones de seguridad de tipos para estas bibliotecas.

En conclusión, adoptar TypeScript es más que simplemente usar una nueva sintaxis; se trata de adoptar nuevas prácticas que ayuden a evitar errores, hacer que el código sea más legible y mejorar el mantenimiento. Evite las trampas comunes y recuerde que el objetivo es escribir código más limpio, más confiable y más fácil de mantener.




Conclusión

Bueno amigos, hemos llegado al final de nuestro viaje de migración a TypeScript. Ha sido todo un viaje, ¿no? Comenzamos con la gran pregunta de "por qué" y profundizamos en el meollo de la cuestión de cambiar un proyecto de React de JavaScript a TypeScript. Desde configurar su entorno TypeScript hasta refactorizar componentes, administrar estados, manejar rutas e incluso lidiar con esos molestos paquetes que no son TypeScript, hemos cubierto mucho terreno.


Al reflexionar sobre este viaje, queda claro que migrar a TypeScript no es una simple "búsqueda y reemplazo" de archivos .js con .tsx . Es un movimiento estratégico que implica aprender nuevas convenciones, comprender los tipos en profundidad y, lo más importante, cambiar la forma en que pensamos sobre la confiabilidad y coherencia de nuestro código.


Aquí hay algunas conclusiones a medida que concluimos:

  1. Red de seguridad : TypeScript ha introducido una capa de seguridad en nuestro proyecto, detectando errores antes de que causen estragos en tiempo de ejecución. Esta red de seguridad, una vez que te acostumbras, cambia las reglas del juego en términos de confianza en tu código y velocidad general de desarrollo.


  2. Comunicación más clara : con los tipos, nuestro código ahora se comunica de manera más explícita. Ya sea que usted esté revisando su código o un nuevo miembro del equipo que intente comprender las estructuras de sus componentes, TypeScript sirve como una capa de documentación adicional.


  3. Confianza en la refactorización : ¿Tienes miedo de refactorizar? Bueno, TypeScript te respalda. Dado que los tipos garantizan contratos dentro de su código, se detectan muchos errores potenciales durante las fases de refactorización, lo que hace que el proceso sea menos desalentador.


  4. Comunidad y ecosistema : adoptar TypeScript abre las puertas a un ecosistema próspero. Desde bibliotecas escritas en DefinitelyTyped hasta soporte infinito en foros comunitarios y una integración de paquetes de terceros más optimizada, estás en buena compañía.


  5. Curva de aprendizaje : Sí, TypeScript introduce una curva de aprendizaje. Probablemente hubo momentos de frustración, confusiones en torno a tipos e interfaces, o luchas con el compilador. Pero mire hacia atrás en su viaje y verá cuánto más comprende su código y su comportamiento ahora.


Recuerde, la transición a TypeScript no es un sprint; es un maratón. Puede haber algunos obstáculos inicialmente, pero las ganancias a largo plazo en calidad, previsibilidad y mantenibilidad del código bien valen el esfuerzo.


A medida que continúa su viaje de desarrollo, siga explorando, aprendiendo y compartiendo sus experiencias con TypeScript. Cada desafío es una oportunidad para aprender. Tu yo futuro (y tu equipo) te agradecerán el código base robusto, con seguridad de escritura y significativamente más fácil de mantener que estás cultivando hoy.


Gracias por acompañarme en esta exploración de TypeScript con React. Sigue codificando, sigue mejorando y, lo más importante, ¡disfruta el proceso!


Mantente conectado

Si disfrutó este artículo y desea explorar más sobre el desarrollo web, no dude en conectarse conmigo en varias plataformas:

dev.to

hackernoon.com

hashnode.com

twitter.com


Sus comentarios y preguntas siempre son bienvenidos.

Siga aprendiendo, codificando y creando increíbles aplicaciones web.


¡Feliz codificación!



Recursos adicionales

Aunque nuestra guía ha llegado a su fin, tu aventura con TypeScript no termina aquí. El mundo de TypeScript es vasto, con una gran cantidad de recursos para explorar, aprender y contribuir. A continuación se muestran algunos recursos valiosos que pueden ayudarle a reforzar su comprensión y mantenerlo actualizado en la comunidad de TypeScript.


  1. Documentación oficial de TypeScript : no hay mejor lugar para explorar TypeScript que su sitio web oficial . Está repleto de documentación detallada, ejemplos y explicaciones sobre diversas funciones.


  2. DefinitelyTyped : cuando se trabaja con bibliotecas de terceros, DefinitelyTyped es un salvavidas. Es un repositorio masivo de definiciones de tipos TypeScript de alta calidad.


  3. Hoja de referencia de React TypeScript : esta completa hoja de referencia está dirigida específicamente a los desarrolladores de React que realizan la transición a TypeScript y cubre patrones y prácticas comunes.


  4. TypeScript Deep Dive : un excelente libro en línea que ofrece una exploración detallada de TypeScript. Deep Dive explica el meollo de la cuestión de TypeScript centrándose en escenarios prácticos.


  5. Repositorio TypeScript GitHub : interactúe con la comunidad y manténgase actualizado con los últimos desarrollos en TypeScript visitando el repositorio oficial de TypeScript GitHub .


  6. Stack Overflow : la etiqueta TypeScript en Stack Overflow es un centro de consultas comunes (y poco comunes) y casos de uso matizados que encuentran los desarrolladores de todo el mundo. Es una mina de oro de conocimientos prácticos.


  7. TypeScript Weekly : TypeScript Weekly , un boletín informativo seleccionado, ofrece los últimos artículos, consejos y recursos directamente en su bandeja de entrada.


  8. Canales de Reddit y Discord : las comunidades en plataformas como r/typescript de Reddit y varios canales de Discord albergan debates vibrantes, noticias e hilos de resolución de problemas relacionados con TypeScript.


  9. Blog oficial de TypeScript : para anuncios, inmersiones profundas y tutoriales del equipo de TypeScript, consulte el blog oficial .


  10. Plataformas de codificación en línea : las experiencias de aprendizaje interactivo a través de plataformas como Codecademy , freeCodeCamp y Scrimba ofrecen cursos prácticos de TypeScript.


Recuerde, las comunidades prosperan gracias a la participación. No dude en hacer preguntas, aportar respuestas o compartir sus soluciones y experiencias. La sabiduría colectiva de los foros comunitarios, la documentación oficial y la práctica continua lo guiarán hacia el dominio de TypeScript.


¡Feliz codificación!