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
- 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.