Capitalize în TypeScript

Capitalize<S> face prima literă a unui tip text mare; Uncapitalize<S> o face mică.

Sintaxă
type C = Capitalize<"nume">;     // "Nume"
type U = Uncapitalize<"Nume">;   // "nume"

Ce face Capitalize

Capitalize<"click"> este "Click": doar prima literă se schimbă, restul rămâne cum este. Uncapitalize<"Click"> face invers. Ca Uppercase, sunt tipuri intrinseci, se aplică fiecărei variante dintr-un union și nu schimbă nimic la rulare.

Locul lor obișnuit este în mapped types cu as și în template literal types: din cheia nume faci getNume/setNume, din evenimentul click faci onClick.

Cheile lui keyof T pot fi și numere sau simboluri, pe care Capitalize nu le acceptă; de aceea în mapped types scrii Capitalize<K & string>.

Parametri

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

Ce returnează

Tipul text cu prima literă schimbată.

Exemple

Exemplul 1: Nume de handler-e pentru evenimente

type Eveniment = "click" | "focus" | "schimbare";
type Handlere = { [E in Eveniment as `on${Capitalize<E>}`]?: () => void };

const h: Handlere = {
    onClick: () => console.log("click!"),
    onSchimbare: () => console.log("valoare nouă"),
};

for (const e of ["click", "focus", "schimbare"] as Eveniment[]) {
    const cheie = `on${e[0].toUpperCase()}${e.slice(1)}` as `on${Capitalize<Eveniment>}`;
    (h[cheie] ?? (() => console.log(`fără handler pentru ${e}`)))();
}

Rezultat

click!
fără handler pentru focus
valoare nouă

Exemplul 2: Uncapitalize pentru chei JSON

type CheiServer = "Nume" | "Oras" | "NotaFinala";
type CheiLocale = Uncapitalize<CheiServer>;     // "nume" | "oras" | "notaFinala"

function laLocal(date: Record<CheiServer, string>): Record<CheiLocale, string> {
    return { nume: date.Nume, oras: date.Oras, notaFinala: date.NotaFinala };
}

console.log(laLocal({ Nume: "Ana", Oras: "Iași", NotaFinala: "10" }));

Rezultat

{ nume: 'Ana', oras: 'Iași', notaFinala: '10' }

Exemplul 3: Restul literelor nu se schimbă

type T = Capitalize<"iASI">;
const a: T = "Iasi";
console.log(a);

Eroarea afișată de tsc

exemplu.mts(2,7): error TS2322: Type '"Iasi"' is not assignable to type '"IASI"'.

Greșeli frecvente

  • Te aștepți ca Capitalize<"iASI"> să dea "Iasi". Dă "IASI": doar prima literă se schimbă.
  • Folosești Capitalize<K> cu K extends keyof T fără & string. tsc dă Type ‘K’ does not satisfy the constraint ‘string’.

Comenzi înrudite

  • Uppercase: Uppercase<S> transformă un tip text în majuscule, Lowercase<S> în litere mici, la nivel de tip.
  • 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]: … }.