fp-ts para TypeScript: guía completa de programación funcional
1. ¿Qué es y para qué sirve?
fp-ts (Functional Programming in TypeScript) es una potente librería de código abierto que incorpora el paradigma de la programación funcional (PF) a TypeScript. Proporciona un conjunto de tipos, funciones y combinadores inspirados en lenguajes como Haskell, PureScript y Scala. A diferencia del enfoque imperativo u orientado a objetos, fp-ts permite escribir código puro, predecible y fácil de probar. La librería se basa en conceptos como functores, mónadas, functores aplicativos y otras abstracciones que ayudan a gestionar efectos secundarios, manejar errores y trabajar con asincronía sin excepciones ni mutación de estado.
¿Por qué usar fp-ts? En el desarrollo moderno con TypeScript surgen problemas frecuentes: excepciones inesperadas (por ejemplo, al trabajar con null o undefined), dificultad para realizar pruebas debido a dependencias ocultas y efectos secundarios, así como código asíncrono confuso con callbacks. fp-ts resuelve estos problemas ofreciendo un sistema de tipos estricto y abstracciones componibles. Por ejemplo, el tipo Option modela explícitamente la ausencia de un valor, mientras que Either maneja errores sin necesidad de try/catch. Esto hace que el código sea más seguro y esté mejor documentado a nivel de tipos.
La librería es especialmente útil en proyectos con lógica de negocio compleja, donde la fiabilidad y el mantenimiento son cruciales. También es ideal para equipos que quieran adoptar principios funcionales de forma gradual, sin reescribir todo el proyecto. fp-ts cuenta con una comunidad activa y un rico ecosistema que incluye integraciones con io-ts (validación de datos), monocle-ts (lentes) y hyper-ts (servidores web).
2. Instalación
fp-ts se distribuye a través de npm. Para instalarlo, ejecuta el siguiente comando:
npm install fp-ts
También se recomienda instalar @types/node para obtener soporte de tipos de Node.js si no trabajas en el navegador:
npm install -D @types/node
Para usar fp-ts necesitas TypeScript versión 4.0 o superior. Asegúrate de que en tu archivo tsconfig.json esté habilitada la opción "strict": true para máxima seguridad de tipos.
3. Inicio rápido — ejemplo mínimo funcional
Veamos un ejemplo sencillo: la división segura de dos números manejando la división entre cero. Sin fp-ts, escribiríamos:
function divide(a: number, b: number): number | null {
if (b === 0) return null;
return a / b;
}
const result = divide(10, 2);
if (result !== null) {
console.log(result); // 5
}
Con fp-ts usamos el tipo Option:
import { pipe } from 'fp-ts/function';
import { Option, some, none, fromPredicate } from 'fp-ts/Option';
const safeDivide = (a: number, b: number): Option =>
pipe(
b,
fromPredicate((x) => x !== 0),
Option.map((divisor) => a / divisor)
);
const result = safeDivide(10, 2);
// result: Option — some(5) o none
// Extraemos el valor
import { fold } from 'fp-ts/Option';
const message = pipe(
result,
fold(
() => 'Error: división entre cero',
(value) => `Resultado: ${value}`
)
);
console.log(message); // "Resultado: 5"
Este ejemplo muestra los principios clave de fp-ts: composición mediante pipe, modelado explícito de la ausencia de valor y manejo de errores sin excepciones.
4. Métodos/funciones/clases principales
4.1. Option — trabajo con valores opcionales
Firma:
// Constructores
declare const some: (a: A) => Option;
declare const none: Option;
// Métodos principales
declare const map: (f: (a: A) => B) => (fa: Option También en la biblioteca
Procesamiento y análisis de Markdown en PHP: bibliotecas y herramientas
Trabajo con CSV en TypeScript: bibliotecas y ejemplos de código
Contenedores de Inyección de Dependencias en Rust: descripción general e implementación con el ejemplo de «dicy»
Retrofit para Java: guía completa con ejemplos prácticos