Ho scritto questo piccolo memo a mio e tuo beneficio, perché per tanti che approcciano a linguaggi simili a nodeJS è difficile o comunque ostico capire cosa capperi fa la funzione con i 3 puntini.
Prima di tutto voglio che sappiate che destrutturare è una cosa troppo utile per non usarla, pertanto abbracciala con disinvoltura e con amore.
Prima cosa: cosa fa la destrutturazione?
Quando fai qualcosa del tipo:
const { pippo, pluto, paperino } = { pippo: 1, pluto: 2, paperino: 3 };
Stai essenzialmente “estraendo” delle proprietà da un oggetto e creando delle variabili con i loro valori. In questo caso, sì, stai creando tre variabili:
pippo
con valore1
pluto
con valore2
paperino
con valore3
Queste sono variabili a tutti gli effetti, quindi puoi richiamarle più avanti nel tuo codice.
Destrutturazione con valori predefiniti
Ora, se fai:
const { page = 1, pageSize = 20, cache = 'cache', ...filters } = params;
page
,pageSize
, ecache
sono variabili estratte daparams
, e separams
non contiene questi valori, verranno utilizzati i valori predefiniti (1
,20
,'cache'
)....filters
raccoglie tutte le altre proprietà diparams
che non sono state esplicitamente estratte.
Così come page, pageSize e cache, potrai usare anche filters come costante da lì in poi disponibile nel tuo codice.
Facciamo un esempio completo:
Supponiamo di avere questo oggetto:
const params = { pippo: 10, pluto: 20, paperino: 30, page: 5 };
Ora facciamo la destrutturazione:
const { page = 1, pageSize = 20, cache = 'cache', ...filters } = params;
Ecco cosa succede:
page
: Viene preso daparams
ed è5
.pageSize
: Non esiste inparams
, quindi viene assegnato il valore predefinito20
.cache
: Non esiste inparams
, quindi viene assegnato il valore predefinito'cache'
.filters
: Contiene tutte le altre proprietà diparams
, cioè{ pippo: 10, pluto: 20, paperino: 30 }
.
Cosa succede a filters
?
Dopo la destrutturazione, filters
diventa un oggetto che contiene tutto ciò che non è stato esplicitamente estratto. Quindi sì, le proprietà che non vengono destrutturate (come pippo
, pluto
, paperino
), finiscono in filters
.
Risultato:
page
è5
(viene preso daparams
).pageSize
è20
(valore predefinito).cache
è'cache'
(valore predefinito).filters
è{ pippo: 10, pluto: 20, paperino: 30 }
.
Quindi, sì, se usi ...filters
, le costanti che hai definito all’inizio, come page
, pageSize
, e cache
, non saranno incluse in filters
, ma saranno create come variabili distinte.
Conclusione:
page
,pageSize
,cache
vengono create come variabili a sé stanti, con valori presi daparams
(o predefiniti se non ci sono).filters
raccoglie tutte le proprietà diparams
che non sono state estratte (comepippo
,pluto
, epaperino
in questo caso).