NonNullable în TypeScript

NonNullable<T> elimină null și undefined din tipul T.

Sintaxă
type NonNullable<T> = T & {};

Ce face NonNullable

NonNullable<string | null | undefined> dă string. Este tipul unei valori după ce ai verificat că există. Folosește-l când ai un tip care poate lipsi și ai nevoie de varianta lui „sigur prezentă”, de exemplu tipul elementelor după ce ai filtrat valorile goale.

Din TypeScript 4.8 este definit ca T & {} (înainte era T extends null | undefined ? never : T); {} înseamnă „orice valoare în afară de null și undefined”. Efectul este același.

Nu face nimic la rulare. Valoarea trebuie verificată cu if, un predicat sau ??.

Parametri

Parametru Descriere
T Tipul din care se elimină null și undefined.

Ce returnează

T fără null și undefined.

Exemple

Exemplul 1: Filtrarea valorilor lipsă

function exista<T>(x: T): x is NonNullable<T> {
    return x !== null && x !== undefined;
}

const telefoane: (string | null | undefined)[] = ["0722000111", null, "0744000222", undefined];
const valide: string[] = telefoane.filter(exista);
console.log(valide);

Rezultat

[ '0722000111', '0744000222' ]

Exemplul 2: Tipul proprietății fără lipsă

interface Elev {
    nume: string;
    email?: string | null;
}
type Email = NonNullable<Elev["email"]>;     // string

function trimite(catre: Email): string {
    return `trimis la ${catre.toLowerCase()}`;
}

const e: Elev = { nume: "Ana", email: "Ana@Scoala.ro" };
if (e.email) console.log(trimite(e.email));

Rezultat

trimis la ana@scoala.ro

Exemplul 3: null nu mai este acceptat

type Nota = number | null;
const n: NonNullable<Nota> = null;
console.log(n);

Eroarea afișată de tsc

exemplu.mts(2,7): error TS2322: Type 'null' is not assignable to type 'number'.

Greșeli frecvente

  • Faci valoare as NonNullable<T> fără verificare. Dacă valoarea lipsește, eroarea apare la rulare.

Comenzi înrudite

  • null și undefined: Cu strictNullChecks, null și undefined sunt tipuri separate: o variabilă le acceptă doar dacă tipul ei le include.
  • non-null (!): Semnul ! după o expresie îi spune compilatorului că valoarea nu este null sau undefined, fără verificare.
  • Exclude: Exclude<T, U> elimină din union-ul T variantele care se potrivesc cu U.
  • Required: Required<T> face toate proprietățile lui T obligatorii, inclusiv pe cele marcate cu ?.