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