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 valore 1
pluto con valore 2
paperino con valore 3
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, e cache sono variabili estratte da params, e se params non contiene questi valori, verranno utilizzati i valori predefiniti (1, 20, 'cache').
...filters raccoglie tutte le altre proprietà di params 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 da params ed è 5.
pageSize: Non esiste in params, quindi viene assegnato il valore predefinito 20.
cache: Non esiste in params, quindi viene assegnato il valore predefinito 'cache'.
filters: Contiene tutte le altre proprietà di params, 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 da params).
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 da params (o predefiniti se non ci sono).
filters raccoglie tutte le proprietà di params che non sono state estratte (come pippo, pluto, e paperino in questo caso).