Créer un hook React personnalisé avec TypeScript et des tests

Concevez et implémentez un custom hook React typé, avec nettoyage des effets, gestion des conditions de concurrence, un composant d’exemple et des tests prêts à lancer. Conçu pour ChatGPT, Claude, Gemini et Microsoft Copilot. Il comprend 4 variables personnalisables et vous pouvez le copier gratuitement en un clic.

Intermédiaire · Code · En attente de relecture éditoriale

Prompt

Agis comme un ingénieur React senior spécialisé dans les hooks réutilisables et bien typés.

Contexte :
- Ce que doit faire le hook : {{objectif_hook}}
- Source de données ou contrat d'API : {{contrat_donnees}}
- Stack : {{stack}}
- Outil de test : {{tests}}

Avant d'écrire du code, pose-moi les questions indispensables s'il manque une information (forme exacte de la réponse, format des erreurs, exécution éventuelle côté serveur).

Livrables :
1. L'API publique du hook : nom (commençant par « use »), paramètres, valeur de retour et justification de cette forme (objet ou tuple).
2. L'implémentation complète en TypeScript, avec des types explicites et sans `any`.
3. Une gestion correcte : nettoyage au démontage, conditions de concurrence entre requêtes (AbortController ou drapeau d'abandon), callbacks stables (useCallback/useRef seulement là où c'est utile) et états de chargement, d'erreur et de résultat vide.
4. Un court composant d'exemple qui utilise le hook.
5. Des tests avec {{tests}} couvrant le cas nominal, une erreur, une ancienne réponse qui arrive en retard et le démontage pendant une requête (avec de faux timers s'il y a un debounce). Si j'ai choisi « sans tests », liste les cas à vérifier à la main.
6. Les limites : ce que le hook ne fait pas (cache, nouvelles tentatives, SSR) et quand une bibliothèque comme TanStack Query serait préférable.

Contraintes :
- Respecte les règles des hooks et n'utilise pas useEffect pour dériver un état calculable pendant le rendu.
- N'invente ni endpoint ni champ en dehors de {{contrat_donnees}} ; utilise [À COMPLÉTER] quand une information manque.
- Des commentaires uniquement quand la raison n'est pas évidente.

Format : sections avec titres et un bloc de code par fichier, avec son nom.

Comment l'utiliser

  1. Décris en une phrase ce que le hook doit résoudre et colle le vrai contrat de ton API. 2. Réponds aux questions avant la génération du code. 3. Copie les fichiers, lance les tests et demande des corrections ciblées si un test échoue.

Exemple d'utilisation

Objectif : rechercher des produits pendant la saisie, avec un debounce de 300 ms · Contrat : GET /api/produits?q= renvoie { items, total } · Stack : React 18 + Vite · Tests : Vitest.

Exemple de résultat

API publique

useProductSearch(query, delay?) renvoie un objet { items, total, loading, error } : plus lisible qu'un tuple dès qu'il y a quatre valeurs.

useProductSearch.ts

import { useEffect, useState } from 'react';

export type Produit = { id: string; nom: string }; // [À COMPLÉTER : vrais champs]
type Etat = { items: Produit[]; total: number; loading: boolean; error: Error | null };
const initial: Etat = { items: [], total: 0, loading: false, error: null };

export function useProductSearch(query: string, delay = 300): Etat {
  const [etat, setEtat] = useState<Etat>(initial);

  useEffect(() => {
    const q = query.trim();
    if (!q) return setEtat(initial);
    const controller = new AbortController();
    const timer = setTimeout(async () => {
      setEtat((s) => ({ ...s, loading: true, error: null }));
      try {
        const res = await fetch(`/api/produits?q=${encodeURIComponent(q)}`, { signal: controller.signal });
        if (!res.ok) throw new Error(`HTTP ${res.status}`);
        const data: { items: Produit[]; total: number } = await res.json();
        setEtat({ ...data, loading: false, error: null });
      } catch (err) {
        if (!controller.signal.aborted) setEtat((s) => ({ ...s, loading: false, error: err as Error }));
      }
    }, delay);
    return () => { clearTimeout(timer); controller.abort(); };
  }, [query, delay]);

  return etat;
}

Le nettoyage de l'effet annule le minuteur et la requête précédente : une réponse obsolète ne peut jamais écraser la plus récente…

Informations clés

Catégorie
Programmation et développement · React
Type de résultat
Code
Niveau
Intermédiaire
Conçu pour
ChatGPT, Claude, Gemini et Microsoft Copilot
Vérifié sur
En attente de vérification éditoriale
Variables
Ce que doit faire le hook, Contrat de données ou d’API, Stack et Tests
Langue
Français
Prix
Gratuit, sans inscription
Mis à jour
07/11/2026

Questions fréquentes

Quand un custom hook vaut-il mieux que la logique dans le composant ?

Quand la même logique avec état se répète dans plusieurs composants, ou quand l’extraire rend le composant nettement plus lisible et testable. Pour une logique courte utilisée une seule fois, ce n’est pas toujours rentable.

Pourquoi le prompt insiste-t-il sur les conditions de concurrence ?

C’est le bug le plus fréquent dans les hooks qui chargent des données : la réponse lente d’une recherche précédente peut écraser la plus récente. Annuler ou ignorer les réponses obsolètes l’évite.

Est-ce que cela remplace TanStack Query ou SWR ?

Non. Pour le cache, les nouvelles tentatives ou l’invalidation, mieux vaut une bibliothèque éprouvée. Le prompt t’indique quand franchir le pas.

À quoi sert ce prompt ?

Concevez et implémentez un custom hook React typé, avec nettoyage des effets, gestion des conditions de concurrence, un composant d’exemple et des tests prêts à lancer.

Avec quels outils d'IA fonctionne-t-il ?

Il est conçu pour ChatGPT, Claude, Gemini et Microsoft Copilot. Nous ne l'avons pas encore vérifié sur ces outils ; les résultats peuvent donc varier de l'un à l'autre.

Comment personnaliser le prompt ?

Cliquez sur « Personnaliser » et remplissez les variables (Ce que doit faire le hook, Contrat de données ou d’API, Stack et Tests). Le texte se met à jour instantanément et vous pouvez ensuite le copier en un clic. Les valeurs sont stockées uniquement dans votre navigateur.

Faut-il de l'expérience pour l'utiliser ?

Il est de niveau intermédiaire : il vaut mieux connaître le sujet pour fournir un bon contexte et relire le résultat d'un œil critique.

Ce prompt est-il gratuit ?

Oui. Tous les prompts de HomeCasa Prompts sont gratuits, sans inscription ni abonnement. Vous pouvez aussi les utiliser dans des projets professionnels.

Puis-je me fier au résultat de l'IA ?

Considérez-le comme un brouillon de qualité : vérifiez toujours les données, les chiffres et les affirmations importantes avant de publier ou de prendre des décisions.

Prompts similaires