Required în TypeScript

Required<T> face toate proprietățile lui T obligatorii, inclusiv pe cele marcate cu ?.

Sintaxă
type Required<T> = { [P in keyof T]-?: T[P] };

Ce face Required

Required<T> este opusul lui Partial: scoate ? de pe toate proprietățile, iar undefined dispare din tipul lor. Un Required<Optiuni> trebuie să aibă toate proprietățile.

Situația tipică: o funcție primește opțiuni parțiale de la utilizator, le completează cu valori implicite și lucrează mai departe cu un obiect complet. Tipul obiectului complet este Required<Optiuni>, deci în restul codului nu mai verifici undefined.

Folosește modificatorul -? al mapped types. Ca toate tipurile utilitare de acest fel, acționează doar la primul nivel.

Parametri

Parametru Descriere
T Tipul obiect ale cărui proprietăți devin obligatorii.

Ce returnează

Un tip obiect cu aceleași chei ca T, toate obligatorii.

Exemple

Exemplul 1: Opțiuni completate cu valori implicite

interface Optiuni {
    titlu?: string;
    pagina?: number;
    pePagina?: number;
}

function completeaza(o: Optiuni): Required<Optiuni> {
    return { titlu: "Catalog", pagina: 1, pePagina: 20, ...o };
}

const c = completeaza({ pagina: 3 });
const start = (c.pagina - 1) * c.pePagina;      // nu mai e nevoie de verificări
console.log(c, "primul elev:", start + 1);

Rezultat

{ titlu: 'Catalog', pagina: 3, pePagina: 20 } primul elev: 41

Exemplul 2: Proprietate lipsă

interface Optiuni {
    titlu?: string;
    pagina?: number;
}
const o: Required<Optiuni> = { titlu: "Catalog" };
console.log(o);

Eroarea afișată de tsc

exemplu.mts(5,7): error TS2741: Property 'pagina' is missing in type '{ titlu: string; }' but required in type 'Required<Optiuni>'.

Greșeli frecvente

  • Crezi că Required scoate și undefined scris explicit în tip (x: number | undefined). Scoate doar opționalitatea dată de ?; pentru restul folosește NonNullable.

Comenzi înrudite

  • Partial: Partial<T> face toate proprietățile lui T opționale; util pentru actualizări în care trimiți doar ce se schimbă.
  • NonNullable: NonNullable<T> elimină null și undefined din tipul T.
  • Readonly: Readonly<T> face toate proprietățile lui T readonly: obiectul poate fi citit, dar nu modificat.
  • mapped types: Construiesc un tip nou trecând prin fiecare cheie a altui tip: { [K in keyof T]: … }.