Creare un hook React personalizzato con TypeScript e test

Progetta e implementa un custom hook React tipizzato, con pulizia degli effetti, gestione delle race condition, un componente di esempio e test pronti da eseguire. Pensato per ChatGPT, Claude, Gemini e Microsoft Copilot. Include 4 variabili personalizzabili e puoi copiarlo gratuitamente con un clic.

Intermedio · Codice · In attesa di revisione editoriale

Prompt

Agisci come ingegnere React senior specializzato in hook riutilizzabili e ben tipizzati.

Contesto:
- Cosa deve fare l'hook: {{scopo_hook}}
- Fonte dei dati o contratto dell'API: {{contratto_dati}}
- Stack: {{stack}}
- Strumento di test: {{test}}

Prima di scrivere codice, chiedimi ciò che manca di essenziale (forma esatta della risposta, formato degli errori, se l'hook gira anche lato server).

Consegna:
1. L'API pubblica dell'hook: nome (che inizi con «use»), parametri, valore di ritorno e perché quella forma (oggetto o tupla).
2. L'implementazione completa in TypeScript, con tipi espliciti e senza `any`.
3. Gestione corretta di: pulizia allo smontaggio, race condition tra richieste (AbortController o flag di scarto), callback stabili (useCallback/useRef solo dove serve davvero) e stati di caricamento, errore e vuoto.
4. Un breve componente di esempio che usa l'hook.
5. Test con {{test}} che coprano il caso felice, un errore, una risposta vecchia che arriva in ritardo e lo smontaggio durante una richiesta (con timer finti se c'è debounce). Se ho scelto «senza test», elenca i casi da verificare a mano.
6. Limiti: cosa non fa l'hook (cache, retry, SSR) e quando conviene una libreria come TanStack Query.

Vincoli:
- Rispetta le regole degli hook e non usare useEffect per derivare stato calcolabile durante il render.
- Non inventare endpoint o campi oltre {{contratto_dati}}; usa [DA COMPLETARE] dove mancano informazioni.
- Commenti solo quando il motivo non è evidente.

Formato: sezioni con titoli e un blocco di codice per file, con il suo nome.

Come usarlo

  1. Descrivi in una frase cosa deve risolvere l’hook e incolla il contratto reale della tua API. 2. Rispondi alle domande prima che venga generato il codice. 3. Copia i file, esegui i test e chiedi modifiche mirate se qualcosa fallisce.

Esempio d'uso

Scopo: cercare prodotti mentre l’utente digita, con debounce di 300 ms · Contratto: GET /api/prodotti?q= restituisce { items, total } · Stack: React 18 + Vite · Test: Vitest.

Esempio di risultato

API pubblica

useProductSearch(query, delay?) restituisce un oggetto { items, total, loading, error }: con quattro valori è più leggibile di una tupla.

useProductSearch.ts

import { useEffect, useState } from 'react';

export type Prodotto = { id: string; nome: string }; // [DA COMPLETARE: campi reali]
type Stato = { items: Prodotto[]; total: number; loading: boolean; error: Error | null };
const iniziale: Stato = { items: [], total: 0, loading: false, error: null };

export function useProductSearch(query: string, delay = 300): Stato {
  const [stato, setStato] = useState<Stato>(iniziale);

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

  return stato;
}

Il cleanup dell'effetto cancella il timer e annulla la richiesta precedente, così una risposta vecchia non sovrascrive mai la più recente…

Dati chiave

Categoria
Programmazione e sviluppo · React
Tipo di output
Codice
Livello
Intermedio
Pensato per
ChatGPT, Claude, Gemini e Microsoft Copilot
Verificato in
In attesa di verifica editoriale
Variabili
Cosa deve fare l’hook, Contratto dati o API, Stack e Test
Lingua
Italiano
Prezzo
Gratuito, senza registrazione
Aggiornato
07/11/2026

Domande frequenti

Quando conviene un custom hook invece della logica nel componente?

Quando la stessa logica con stato si ripete in più componenti, o quando estrarla rende il componente molto più leggibile e testabile. Per logica breve usata una sola volta spesso non conviene.

Perché il prompt insiste sulle race condition?

Sono il bug più comune negli hook che caricano dati: la risposta lenta di una ricerca precedente può sovrascrivere quella più recente. Annullare o scartare le risposte vecchie lo evita.

Sostituisce TanStack Query o SWR?

No. Per cache, retry o invalidazione è meglio una libreria collaudata. Il prompt ti indica quando fare il passaggio.

A cosa serve questo prompt?

Progetta e implementa un custom hook React tipizzato, con pulizia degli effetti, gestione delle race condition, un componente di esempio e test pronti da eseguire.

Con quali strumenti di IA funziona?

È pensato per ChatGPT, Claude, Gemini e Microsoft Copilot. Non lo abbiamo ancora verificato in questi strumenti, quindi i risultati possono variare da uno all'altro.

Come personalizzo il prompt?

Clicca su «Personalizza» e compila le variabili (Cosa deve fare l’hook, Contratto dati o API, Stack e Test). Il testo si aggiorna all'istante e poi puoi copiarlo con un clic. I valori vengono salvati solo nel tuo browser.

Serve esperienza per usarlo?

È di livello intermedio: conviene conoscere l'argomento per fornire un buon contesto e valutare il risultato con occhio critico.

Questo prompt è gratuito?

Sì. Tutti i prompt di HomeCasa Prompts sono gratuiti, senza registrazione né abbonamento. Puoi usarli anche in progetti professionali.

Posso fidarmi dell'output dell'IA?

Consideralo una bozza di alta qualità: verifica sempre dati, cifre e affermazioni importanti prima di pubblicare o prendere decisioni.

Prompt correlati