typescript - Destructurarea obiectelor nullable


Typescript (sau ar trebui să spunem ES) nu permite destructurarea obiectelor null/undefined. Aruncă TypeError.

Deci, să zicem că avem ceva de genul

let {a,b,c} = D;

unde D ar putea fi null.

Dacă trebuie să facem alocarea destructurării condiționate cu verificări de null, atunci creăm cod boilerplate pentru ceva care a fost menit să îl reducă.

Care este cel mai elegant mod de a-l folosi în cazuri ca acesta sau ar trebui să folosim destructurarea doar pentru obiecte garantat non-null?

Răspuns #1

Poți folosi un obiect gol ca rezervă, și dacă D este null sau undefined, variabilele atribuite vor fi undefined.

const D = null;
const { a, b, c } = D || {};

console.log(a, b, c);

Folosind TypeScript, trebuie să adaugi tipul corect (sau any) la obiectul FALLBACK (TS playground). De exemplu:

interface Obj {
    a?: string;
    b?: string;
    c?: string;
}

const D = null;
const { a, b, c } = D || {} as Obj;

console.log(a, b, c);

O altă opțiune este să folosești răspândirea obiectului, deoarece răspândirea lui null sau undefined rezultă într-un obiect gol (vezi acest răspuns de pe SO).

const D = null;
const { a, b, c } = { ...D };

console.log(a, b, c);

Folosind TypeScript, trebuie să adaugi tipurile variabilei pe care o extinzi și obiectului pe care îl destructurezi. De exemplu (TS Playground):

interface Obj {
    a?: string;
    b?: string;
    c?: string;
}

const D = null;
const { a, b, c } = { ...D as any } as Obj;

console.log(a, b, c);

Dacă trebuie să gestionezi destructurarea imbricată, folosește valorile implicite:

const D = null;
const { a, a: { z } = {}, b, c } = { ...D };

console.log(a, b, c, z);