Omit în TypeScript

Omit<T, K> creează un tip cu toate proprietățile lui T, mai puțin cele cu numele din K.

Sintaxă
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

Ce face Omit

Omit<T, "a" | "b"> este T fără proprietățile a și b. Exemplul clasic: datele pentru crearea unui elev sunt Omit<Elev, "id">, pentru că id-ul îl pune baza de date.

Este definit cu Pick și Exclude. Spre deosebire de Pick, cheile din K nu sunt verificate față de T: Omit<Elev, "vârsta"> este acceptat chiar dacă Elev nu are vârsta, deci o greșeală de scriere nu elimină nimic și nu dă eroare.

Pe un union de tipuri, Omit nu se aplică pe fiecare variantă, ci pe proprietățile comune, și poate pierde variantele. Pentru discriminated unions folosește o variantă distributivă: T extends unknown ? Omit<T, K> : never.

Parametri

Parametru Descriere
T Tipul obiect de pornire.
K Union cu numele proprietăților eliminate.

Ce returnează

Un tip obiect cu proprietățile lui T care nu sunt în K.

Exemple

Exemplul 1: Date pentru creare, fără id

interface Elev {
    id: number;
    nume: string;
    oras: string;
}
type ElevNou = Omit<Elev, "id">;

const baza: Elev[] = [];
function adauga(date: ElevNou): Elev {
    const elev = { id: baza.length + 1, ...date };
    baza.push(elev);
    return elev;
}

adauga({ nume: "Ana", oras: "Iași" });
adauga({ nume: "Mihai", oras: "Cluj" });
console.log(baza);

Rezultat

[
  { id: 1, nume: 'Ana', oras: 'Iași' },
  { id: 2, nume: 'Mihai', oras: 'Cluj' }
]

Exemplul 2: Ascunderea datelor sensibile

Funcția scoate parola și la rulare (cu destructurare), iar tipul rezultatului o spune.

interface Utilizator {
    email: string;
    nume: string;
    parola: string;
}

function public_(u: Utilizator): Omit<Utilizator, "parola"> {
    const { parola: _, ...rest } = u;
    return rest;
}

console.log(public_({ email: "ana@scoala.ro", nume: "Ana", parola: "secret123" }));

Rezultat

{ email: 'ana@scoala.ro', nume: 'Ana' }

Exemplul 3: Proprietatea eliminată nu mai poate fi dată

interface Elev {
    id: number;
    nume: string;
}
const e: Omit<Elev, "id"> = { id: 5, nume: "Ana" };
console.log(e);

Eroarea afișată de tsc

exemplu.mts(5,31): error TS2353: Object literal may only specify known properties, and 'id' does not exist in type 'Omit<Elev, "id">'.

Greșeli frecvente

  • Scrii greșit numele cheii (Omit<Elev, "Id">). Nu primești eroare și nu se elimină nimic.
  • Folosești Omit pe un discriminated union și pierzi discriminantul. Aplică-l distributiv, pe fiecare variantă.

Comenzi înrudite

  • Pick: Pick<T, K> păstrează din T doar proprietățile cu numele din K.
  • Exclude: Exclude<T, U> elimină din union-ul T variantele care se potrivesc cu U.
  • Partial: Partial<T> face toate proprietățile lui T opționale; util pentru actualizări în care trimiți doar ce se schimbă.
  • keyof: keyof T dă union-ul numelor de proprietăți ale lui T, de exemplu „nume” | „oras”.