Uppercase în TypeScript

Uppercase<S> transformă un tip text în majuscule, Lowercase<S> în litere mici, la nivel de tip.

Sintaxă
type U = Uppercase<"iasi">;   // "IASI"
type L = Lowercase<"IASI">;   // "iasi"

Ce face Uppercase

Uppercase<"get"> este tipul "GET", iar Lowercase<"GET"> este "get". Ele lucrează pe tipuri literale de text, inclusiv pe union-uri (se aplică fiecărei variante) și pe template literal types.

Sunt tipuri „intrinseci”: implementate direct în compilator, nu scrise în TypeScript. Transformarea folosește regulile JavaScript (toUpperCase/toLowerCase fără setări de limbă). Pentru string simplu, rezultatul rămâne un tip text general.

Nu schimbă nimic la rulare. Ca să ai și valoarea transformată, apelezi toUpperCase() și spui tipul cu as, pentru că metoda din JavaScript returnează doar string.

Parametri

Parametru Descriere
S Un tip text: literal, union de literale sau template literal.

Ce returnează

Tipul text transformat.

Exemple

Exemplul 1: Metode HTTP în ambele forme

type Metoda = "get" | "post" | "delete";
type MetodaHttp = Uppercase<Metoda>;            // "GET" | "POST" | "DELETE"

function laHttp<M extends Metoda>(m: M): Uppercase<M> {
    return m.toUpperCase() as Uppercase<M>;
}

const m: MetodaHttp = laHttp("post");
console.log(m, laHttp("delete"));

type Cod = Lowercase<"RO" | "MD">;             // "ro" | "md"
const limba: Cod = "ro";
console.log(limba);

Rezultat

POST DELETE
ro

Exemplul 2: Constante din chei

Cheile obiectului devin nume de constante cu majuscule.

const ore = { inceput: 8, pauza: 12, sfarsit: 16 };
type Constante = { [K in keyof typeof ore as `ORA_${Uppercase<K>}`]: number };

const c: Constante = { ORA_INCEPUT: ore.inceput, ORA_PAUZA: ore.pauza, ORA_SFARSIT: ore.sfarsit };
console.log(c);

Rezultat

{ ORA_INCEPUT: 8, ORA_PAUZA: 12, ORA_SFARSIT: 16 }

Exemplul 3: Varianta cu litere mici nu se potrivește

type M = Uppercase<"get" | "post">;
const m: M = "get";
console.log(m);

Eroarea afișată de tsc

exemplu.mts(2,7): error TS2820: Type '"get"' is not assignable to type '"GET" | "POST"'. Did you mean '"GET"'?

Greșeli frecvente

  • Te aștepți ca Uppercase<string> să verifice că un text oarecare este cu majuscule. Pentru texte necunoscute la compilare, verificarea se face la rulare.

Comenzi înrudite

  • Capitalize: Capitalize<S> face prima literă a unui tip text mare; Uncapitalize<S> o face mică.
  • template literal types: Tipuri de text construite ca un template string: `id-${number}` acceptă „id-1”, „id-42” și așa mai departe.
  • mapped types: Construiesc un tip nou trecând prin fiecare cheie a altui tip: { [K in keyof T]: … }.
  • tipuri literale: Un tip care acceptă o singură valoare exactă, de exemplu „Iași” sau 3; combinate în union dau liste de valori permise.