Saltar al contenido principal
TypeScript Desarrollo 22 min de lectura

TypeScript para Desarrollo Moderno en 2025

De básico a avanzado: domina TypeScript y lleva tu código JavaScript al siguiente nivel con tipos seguros y productividad 10x

Guía Práctica

1 Por Qué TypeScript en 2025

TypeScript ha dejado de ser opcional para convertirse en el estándar de facto del desarrollo web moderno. En 2025, más del 80% de los proyectos nuevos lo adoptan.

Detección temprana de errores

El compilador detecta errores antes de ejecutar el código. Los typos, propiedades inexistentes y type mismatches se capturan en desarrollo, no en producción.

Autocompletado y documentación viva

Tu IDE conoce la estructura completa de tu código. IntelliSense muestra métodos disponibles, parámetros esperados y documentación inline. La productividad se multiplica.

Refactoring seguro

Renombra, mueve y reestructura con confianza. TypeScript actualiza todas las referencias automáticamente.

Escalabilidad

Proyectos grandes con múltiples desarrolladores se vuelven manejables. Los contratos de tipos actúan como documentación ejecutable.

2 Configuración Óptima

Un buen tsconfig.json es fundamental. Aquí la configuración recomendada para 2025:

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "ESNext",
    "lib": ["ES2022", "DOM", "DOM.Iterable"],
    "jsx": "react-jsx",
    "moduleResolution": "bundler",

    // Strict mode (SIEMPRE activado)
    "strict": true,
    "noUncheckedIndexedAccess": true,
    "noImplicitOverride": true,

    // Imports
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "resolveJsonModule": true,

    // Output
    "declaration": true,
    "sourceMap": true,
    "removeComments": true,

    // Paths
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}

💡 Consejo

NUNCA desactives strict mode. Es la clave para aprovechar TypeScript al máximo.

3 Tipos Básicos y Avanzados

Primitivos y arrays

// Primitivos
const nombre: string = "Juan"
const edad: number = 30
const activo: boolean = true

// Arrays
const numeros: number[] = [1, 2, 3]
const nombres: Array<string> = ["Ana", "Luis"]

// Tuplas
const coordenadas: [number, number] = [40.4168, -3.7038]

Interfaces y Types

// Interface (extensible)
interface Usuario {
  id: number
  nombre: string
  email: string
  edad?: number  // Opcional
}

// Type (alias)
type ID = string | number

// Union types
type Estado = "activo" | "inactivo" | "pendiente"

// Intersection types
type UsuarioConRol = Usuario & { rol: string }

Generics

// Función genérica
function obtenerPrimero<T>(array: T[]): T | undefined {
  return array[0]
}

const num = obtenerPrimero([1, 2, 3])     // number | undefined
const str = obtenerPrimero(["a", "b"])    // string | undefined

// Interface genérica
interface Respuesta<T> {
  data: T
  error: string | null
  loading: boolean
}

type UsuarioRespuesta = Respuesta<Usuario>

Utility Types

// Partial - todos los campos opcionales
type UsuarioParcial = Partial<Usuario>

// Required - todos los campos obligatorios
type UsuarioCompleto = Required<Usuario>

// Pick - seleccionar campos
type UsuarioNombreEmail = Pick<Usuario, "nombre" | "email">

// Omit - excluir campos
type UsuarioSinId = Omit<Usuario, "id">

// Record - objeto con claves específicas
type UsuariosPorId = Record<number, Usuario>

4 Patrones Útiles

Type guards

function esUsuario(obj: any): obj is Usuario {
  return typeof obj.id === 'number' && typeof obj.nombre === 'string'
}

function procesar(data: Usuario | string) {
  if (esUsuario(data)) {
    console.log(data.nombre)  // TypeScript sabe que es Usuario
  } else {
    console.log(data.toUpperCase())  // TypeScript sabe que es string
  }
}

Discriminated Unions

type Exito = {
  tipo: "exito"
  datos: Usuario
}

type Error = {
  tipo: "error"
  mensaje: string
}

type Resultado = Exito | Error

function manejar(resultado: Resultado) {
  if (resultado.tipo === "exito") {
    console.log(resultado.datos)  // ✓ TypeScript sabe que existe
  } else {
    console.log(resultado.mensaje)  // ✓ TypeScript sabe que existe
  }
}

Template Literal Types

type EventoClick = "onClick" | "onDoubleClick"
type EventoMouse = "onMouseEnter" | "onMouseLeave"

type TodosEventos = EventoClick | EventoMouse

// Generar tipos dinámicamente
type Color = "red" | "blue" | "green"
type ColorCSS = \`bg-\${Color}\`  // "bg-red" | "bg-blue" | "bg-green"

5 TypeScript con React

Componentes funcionales

interface BotonProps {
  texto: string
  onClick: () => void
  variant?: "primary" | "secondary"
  disabled?: boolean
}

export const Boton: React.FC<BotonProps> = ({
  texto,
  onClick,
  variant = "primary",
  disabled = false
}) => {
  return (
    <button
      onClick={onClick}
      disabled={disabled}
      className={\`btn btn-\${variant}\`}
    >
      {texto}
    </button>
  )
}

Hooks tipados

// useState
const [contador, setContador] = useState<number>(0)
const [usuario, setUsuario] = useState<Usuario | null>(null)

// useRef
const inputRef = useRef<HTMLInputElement>(null)

// useContext
const AuthContext = createContext<{
  usuario: Usuario | null
  login: (email: string, password: string) => Promise<void>
  logout: () => void
} | undefined>(undefined)

// Custom hook
function useLocalStorage<T>(key: string, initialValue: T) {
  const [valor, setValor] = useState<T>(() => {
    const item = window.localStorage.getItem(key)
    return item ? JSON.parse(item) : initialValue
  })

  return [valor, setValor] as const
}

Event handlers

const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
  e.preventDefault()
  console.log("Click!")
}

const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  console.log(e.target.value)
}

const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
  e.preventDefault()
  // Procesar form
}

6 Best Practices

Activa strict mode siempre

Es la única forma de aprovechar TypeScript completamente.

Evita any como la peste

Usa unknown si no conoces el tipo. Fuerza type guards.

Prefiere interfaces para objetos públicos

Son más flexibles y extensibles que types.

Usa const assertions

as const para valores literales inmutables.

No uses type assertions innecesarias

as solo cuando realmente lo necesites.

No dupliques tipos manualmente

Usa utility types y type inference.

7 Preguntas Frecuentes

¿TypeScript hace mi código más lento?

No. TypeScript se compila a JavaScript normal. No hay overhead en runtime, solo en desarrollo.

¿Puedo usar TypeScript con JavaScript existente?

Sí, TypeScript es un superset de JavaScript. Puedes migrar gradualmente archivo por archivo.

¿Interface o Type?

Interface para objetos y clases. Type para uniones, intersecciones y aliases. En la duda, interface.

¿Vale la pena en proyectos pequeños?

Absolutamente. TypeScript ayuda desde el primer día. El setup es mínimo con Vite o Next.js.

¿Listo para TypeScript?

En WebDevFactory desarrollamos con TypeScript desde el día uno para garantizar código robusto y mantenible.

Código type-safe

Best practices

Productividad 10x

Artículos Relacionados

Desarrollo

Tendencias de Desarrollo Web para 2026

IA generativa, edge computing y nuevas arquitecturas...

Leer artículo →
Performance

Optimización de Rendimiento Web en 2025

Core Web Vitals, lazy loading y técnicas avanzadas...

Leer artículo →