Introducción

TypeScript es un superconjunto de JavaScript que añade tipos estáticos opcionales. Utilizar TypeScript con React puede mejorar la calidad del código, facilitar el mantenimiento y reducir errores. En esta sección, aprenderemos cómo integrar TypeScript en un proyecto de React y cómo aprovechar sus características para escribir componentes más robustos y seguros.

Configuración del Entorno

Instalación de TypeScript

Para empezar a usar TypeScript en un proyecto de React, primero necesitamos instalar TypeScript y los tipos para React.

npx create-react-app my-app --template typescript
cd my-app

Este comando crea un nuevo proyecto de React con TypeScript ya configurado.

Archivos de Configuración

El archivo tsconfig.json es el archivo de configuración principal para TypeScript. Aquí hay un ejemplo básico:

{
  "compilerOptions": {
    "target": "es5",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react-jsx"
  },
  "include": ["src"]
}

Tipos Básicos en React

Componentes Funcionales

Los componentes funcionales en TypeScript se escriben de manera similar a los componentes en JavaScript, pero con tipos explícitos.

import React from 'react';

interface GreetingProps {
  name: string;
}

const Greeting: React.FC<GreetingProps> = ({ name }) => {
  return <h1>Hello, {name}!</h1>;
};

export default Greeting;

Componentes de Clase

Para los componentes de clase, también podemos definir tipos para las props y el estado.

import React, { Component } from 'react';

interface CounterProps {
  initialCount: number;
}

interface CounterState {
  count: number;
}

class Counter extends Component<CounterProps, CounterState> {
  constructor(props: CounterProps) {
    super(props);
    this.state = {
      count: props.initialCount
    };
  }

  increment = () => {
    this.setState({ count: this.state.count + 1 });
  };

  render() {
    return (
      <div>
        <p>Count: {this.state.count}</p>
        <button onClick={this.increment}>Increment</button>
      </div>
    );
  }
}

export default Counter;

Uso de Hooks con TypeScript

useState

El hook useState puede ser tipado para asegurar que el estado tenga el tipo correcto.

import React, { useState } from 'react';

const Counter: React.FC = () => {
  const [count, setCount] = useState<number>(0);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
};

export default Counter;

useEffect

El hook useEffect no requiere tipos adicionales, pero podemos tipar las variables que usamos dentro del efecto.

import React, { useEffect, useState } from 'react';

const Timer: React.FC = () => {
  const [seconds, setSeconds] = useState<number>(0);

  useEffect(() => {
    const interval = setInterval(() => {
      setSeconds(prevSeconds => prevSeconds + 1);
    }, 1000);

    return () => clearInterval(interval);
  }, []);

  return <p>Seconds: {seconds}</p>;
};

export default Timer;

Tipos Avanzados

Tipos de Props Opcionales

Podemos definir props opcionales usando el operador ?.

interface UserProps {
  name: string;
  age?: number;
}

const User: React.FC<UserProps> = ({ name, age }) => {
  return (
    <div>
      <p>Name: {name}</p>
      {age && <p>Age: {age}</p>}
    </div>
  );
};

export default User;

Tipos de Unión

Podemos usar tipos de unión para props que pueden tener múltiples tipos.

interface StatusProps {
  status: 'loading' | 'success' | 'error';
}

const Status: React.FC<StatusProps> = ({ status }) => {
  return <p>Status: {status}</p>;
};

export default Status;

Ejercicios Prácticos

Ejercicio 1: Crear un Componente Tipado

Crea un componente Profile que acepte las siguientes props: firstName (string), lastName (string) y age (number, opcional).

import React from 'react';

interface ProfileProps {
  firstName: string;
  lastName: string;
  age?: number;
}

const Profile: React.FC<ProfileProps> = ({ firstName, lastName, age }) => {
  return (
    <div>
      <p>First Name: {firstName}</p>
      <p>Last Name: {lastName}</p>
      {age && <p>Age: {age}</p>}
    </div>
  );
};

export default Profile;

Ejercicio 2: Tipar un Hook Personalizado

Crea un hook personalizado useCounter que gestione un contador. El hook debe devolver el valor del contador y una función para incrementarlo.

import { useState } from 'react';

const useCounter = (initialValue: number) => {
  const [count, setCount] = useState<number>(initialValue);

  const increment = () => {
    setCount(count + 1);
  };

  return { count, increment };
};

export default useCounter;

Conclusión

Integrar TypeScript con React puede parecer desafiante al principio, pero los beneficios en términos de seguridad y mantenibilidad del código son significativos. En esta sección, hemos cubierto cómo configurar un proyecto de React con TypeScript, cómo tipar componentes funcionales y de clase, y cómo usar hooks con TypeScript. Con la práctica, te sentirás más cómodo y podrás aprovechar al máximo las capacidades de TypeScript en tus proyectos de React.

En el siguiente módulo, exploraremos cómo construir aplicaciones móviles con React Native, llevando tus habilidades de React al desarrollo móvil.

Curso de React

Módulo 1: Introducción a React

Módulo 2: Componentes de React

Módulo 3: Trabajando con Eventos

Módulo 4: Conceptos Avanzados de Componentes

Módulo 5: Hooks de React

Módulo 6: Enrutamiento en React

Módulo 7: Gestión del Estado

Módulo 8: Optimización del Rendimiento

Módulo 9: Pruebas en React

Módulo 10: Temas Avanzados

Módulo 11: Proyecto: Construyendo una Aplicación Completa

© Copyright 2024. Todos los derechos reservados