Crear un hook personalizado de React con TypeScript y tests
Diseña e implementa un custom hook de React tipado, con limpieza de efectos, control de condiciones de carrera, un componente de ejemplo y tests listos para ejecutar. Pensado para ChatGPT, Claude, Gemini y Microsoft Copilot. Incluye 4 variables personalizables y se copia gratis en un clic.
Intermedio · Código · Pendiente de revisión editorial
Prompt
Actúa como ingeniero sénior de React especializado en hooks reutilizables y bien tipados.
Contexto:
- Qué debe hacer el hook: {{proposito_hook}}
- Fuente de datos o contrato de la API: {{contrato_datos}}
- Stack: {{stack}}
- Herramienta de tests: {{tests}}
Antes de escribir código, pregúntame lo imprescindible que falte (forma exacta de la respuesta, formato de los errores, si el hook se ejecuta también en servidor).
Entregables:
1. La API pública del hook: nombre (empezando por «use»), parámetros, valor de retorno y por qué esa forma (objeto o tupla).
2. La implementación completa en TypeScript, con tipos explícitos y sin `any`.
3. Gestión correcta de: limpieza al desmontar, condiciones de carrera entre peticiones (AbortController o bandera de descarte), callbacks estables (useCallback/useRef solo donde importe de verdad) y estados de carga, error y vacío.
4. Un componente de ejemplo breve que use el hook.
5. Tests con {{tests}} que cubran el caso feliz, un error, una respuesta antigua que llega tarde y el desmontaje durante una petición (con temporizadores falsos si hay debounce). Si eliges «sin tests», enumera los casos que debería probar a mano.
6. Limitaciones: qué no hace el hook (caché, reintentos, SSR) y cuándo convendría una librería como TanStack Query.
Restricciones:
- Respeta las reglas de los hooks y no uses useEffect para derivar estado que puede calcularse durante el render.
- No inventes endpoints ni campos fuera de {{contrato_datos}}; usa [COMPLETAR] donde falte información.
- Comentarios solo cuando el motivo no sea evidente.
Formato: secciones con encabezados y un bloque de código por archivo, con su nombre.Cómo usarlo
- Describe en una frase qué debe resolver el hook y pega el contrato real de tu API. 2. Responde a las preguntas que te haga antes de generar el código. 3. Copia los archivos, ejecuta los tests y pide ajustes concretos si alguno falla.
Ejemplo de uso
Propósito: buscar productos mientras el usuario escribe, con debounce de 300 ms · Contrato: GET /api/productos?q= devuelve { items, total } · Stack: React 18 + Vite · Tests: Vitest.
Resultado de ejemplo
API pública
useProductSearch(query, delay?) devuelve un objeto { items, total, loading, error }: es más legible que una tupla cuando hay cuatro valores.
useProductSearch.ts
import { useEffect, useState } from 'react';
export type Producto = { id: string; nombre: string }; // [COMPLETAR: campos reales]
type Estado = { items: Producto[]; total: number; loading: boolean; error: Error | null };
const inicial: Estado = { items: [], total: 0, loading: false, error: null };
export function useProductSearch(query: string, delay = 300): Estado {
const [estado, setEstado] = useState<Estado>(inicial);
useEffect(() => {
const q = query.trim();
if (!q) return setEstado(inicial);
const controller = new AbortController();
const timer = setTimeout(async () => {
setEstado((s) => ({ ...s, loading: true, error: null }));
try {
const res = await fetch(`/api/productos?q=${encodeURIComponent(q)}`, { signal: controller.signal });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data: { items: Producto[]; total: number } = await res.json();
setEstado({ ...data, loading: false, error: null });
} catch (err) {
if (!controller.signal.aborted) setEstado((s) => ({ ...s, loading: false, error: err as Error }));
}
}, delay);
return () => { clearTimeout(timer); controller.abort(); };
}, [query, delay]);
return estado;
}
La limpieza del efecto cancela el temporizador y aborta la petición anterior, así una respuesta antigua nunca sobrescribe la más reciente…
Datos clave
- Categoría
- Programación y desarrollo · React
- Tipo de resultado
- Código
- Nivel
- Intermedio
- Pensado para
- ChatGPT, Claude, Gemini y Microsoft Copilot
- Verificado en
- Pendiente de verificación editorial
- Variables
- Qué debe hacer el hook, Contrato de datos o API, Stack y Tests
- Idioma
- Español
- Precio
- Gratis, sin registro
- Actualizado
- 07/11/2026
Preguntas frecuentes
¿Cuándo merece la pena un custom hook en lugar de lógica en el componente?
Cuando la misma lógica con estado se repite en varios componentes o cuando aislarla hace el componente mucho más legible y testeable. Si solo se usa una vez y es corta, no siempre compensa.
¿Por qué el prompt insiste en las condiciones de carrera?
Porque es el fallo más habitual en hooks que piden datos: una respuesta lenta de una búsqueda anterior puede sobrescribir la más reciente. Cancelar o descartar respuestas antiguas lo evita.
¿Sustituye a TanStack Query o SWR?
No. Para caché, reintentos, sincronización entre pestañas o invalidación es mejor una librería probada. El prompt te indica cuándo dar ese paso.
¿Para qué sirve este prompt?
Diseña e implementa un custom hook de React tipado, con limpieza de efectos, control de condiciones de carrera, un componente de ejemplo y tests listos para ejecutar.
¿Con qué herramientas de IA funciona?
Está pensado para ChatGPT, Claude, Gemini y Microsoft Copilot. Todavía no lo hemos verificado en estas herramientas, por lo que los resultados pueden variar entre ellas.
¿Cómo personalizo el prompt?
Pulsa «Personalizar» y rellena las variables (Qué debe hacer el hook, Contrato de datos o API, Stack y Tests). El texto se actualiza al instante y después puedes copiarlo con un clic. Los valores se guardan solo en tu navegador.
¿Necesito experiencia para usarlo?
Es de nivel intermedio: conviene que conozcas el tema para aportar buen contexto y revisar el resultado con criterio.
¿Este prompt es gratis?
Sí. Todos los prompts de HomeCasa Prompts son gratuitos, sin registro ni suscripción. Puedes usarlos también en proyectos profesionales.
¿Puedo fiarme del resultado de la IA?
Úsalo como un borrador de calidad: revisa siempre datos, cifras y afirmaciones importantes antes de publicarlos o tomar decisiones.