Introducción a TypeScript - Desarrollo JavaScript con Seguridad de Tipos

principiante | 50 min de lectura | 2024.12.16

Lo que Aprenderás en Este Tutorial

✓ Tipos básicos de TypeScript
✓ Cómo funciona la inferencia de tipos
✓ Interfaces y type aliases
✓ Union types y literal types
✓ Fundamentos de generics
✓ Patrones prácticos de definición de tipos

Prerrequisitos

  • Conocimiento básico de JavaScript
  • Node.js instalado

Configuración del Proyecto

# Crear directorio del proyecto
mkdir typescript-tutorial
cd typescript-tutorial

# Crear package.json
npm init -y

# Instalar TypeScript
npm install -D typescript ts-node @types/node

# Crear tsconfig.json
npx tsc --init

Configuración de tsconfig.json

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "outDir": "./dist"
  },
  "include": ["src/**/*"]
}

Paso 1: Tipos Básicos

Tipos Primitivos

// src/01-primitives.ts

// String
let nombre: string = "Juan";
let saludo: string = `Hola, ${nombre}`;

// Number
let edad: number = 25;
let precio: number = 1980.5;
let hex: number = 0xff;

// Boolean
let estaActivo: boolean = true;
let tienePermiso: boolean = false;

// null y undefined
let nada: null = null;
let noDefinido: undefined = undefined;

// any (desactiva verificación de tipos - evita cuando sea posible)
let cualquierCosa: any = "string";
cualquierCosa = 123;
cualquierCosa = true;

// unknown (más seguro que any)
let valorDesconocido: unknown = "hola";
// valorDesconocido.toUpperCase(); // Error
if (typeof valorDesconocido === "string") {
  valorDesconocido.toUpperCase(); // OK
}

Arrays y Tuplas

// Arrays
let numeros: number[] = [1, 2, 3, 4, 5];
let nombres: string[] = ["Alice", "Bob", "Charlie"];

// Notación genérica
let valores: Array<number> = [10, 20, 30];

// Tuplas (arrays de longitud y tipo fijos)
let tupla: [string, number] = ["edad", 25];
let rgb: [number, number, number] = [255, 128, 0];

// Tuplas etiquetadas
let usuario: [nombre: string, edad: number] = ["Juan", 30];

// Arrays readonly
let numerosReadonly: readonly number[] = [1, 2, 3];
// numerosReadonly.push(4); // Error

Paso 2: Tipos de Función

Tipos Básicos de Función

// Tipos de parámetros y retorno
function sumar(a: number, b: number): number {
  return a + b;
}

// Arrow functions
const multiplicar = (a: number, b: number): number => a * b;

// Parámetros opcionales
function saludar(nombre: string, saludo?: string): string {
  return `${saludo || "Hola"}, ${nombre}!`;
}

// Rest parameters
function suma(...numeros: number[]): number {
  return numeros.reduce((acc, curr) => acc + curr, 0);
}

console.log(suma(1, 2, 3, 4, 5)); // 15

Paso 3: Type Aliases e Interfaces

Type Aliases (type)

// Type aliases básicos
type ID = string | number;
type Punto = { x: number; y: number };

// Union types
type Estado = "pendiente" | "aprobado" | "rechazado";

let usuarioId: ID = "user_123";
let pedidoId: ID = 456;
let estadoActual: Estado = "pendiente";

// Intersection types
type ConNombre = { nombre: string };
type ConEdad = { edad: number };
type Persona = ConNombre & ConEdad;

const persona: Persona = {
  nombre: "Juan",
  edad: 30
};

Interfaces

// Interface básica
interface Usuario {
  id: number;
  nombre: string;
  email: string;
  edad?: number; // Opcional
  readonly creadoEn: Date; // Readonly
}

const usuario: Usuario = {
  id: 1,
  nombre: "Alice",
  email: "alice@ejemplo.com",
  creadoEn: new Date()
};

// Herencia de interface
interface Empleado extends Usuario {
  departamento: string;
  salario: number;
}

Paso 4: Generics

Generics Básicos

// Función genérica
function identidad<T>(valor: T): T {
  return valor;
}

const str = identidad<string>("hola");
const num = identidad(42); // Inferencia de tipo: number

// Función genérica con arrays
function primero<T>(arr: T[]): T | undefined {
  return arr[0];
}

const primerNumero = primero([1, 2, 3]); // number | undefined

Interfaces Genéricas

// Tipo de respuesta de API
interface RespuestaApi<T> {
  datos: T;
  estado: number;
  mensaje: string;
}

interface Usuario {
  id: number;
  nombre: string;
}

const respuestaUsuario: RespuestaApi<Usuario> = {
  datos: { id: 1, nombre: "Alice" },
  estado: 200,
  mensaje: "Éxito"
};

Paso 5: Utility Types

Utility Types Incorporados

interface Usuario {
  id: number;
  nombre: string;
  email: string;
  edad: number;
}

// Partial - hace todo opcional
type UsuarioParcial = Partial<Usuario>;
const datosActualizacion: UsuarioParcial = { nombre: "Nuevo Nombre" };

// Pick - selecciona propiedades específicas
type UsuarioBasico = Pick<Usuario, "id" | "nombre">;

// Omit - excluye propiedades específicas
type UsuarioSinEmail = Omit<Usuario, "email">;

// Readonly - hace todo readonly
type UsuarioReadonly = Readonly<Usuario>;

Resumen

Al aprovechar el sistema de tipos de TypeScript, puedes detectar errores en tiempo de compilación y escribir código más seguro. Comienza con tipos básicos y avanza hasta dominar generics y utility types.

← Volver a la lista