parametri opționali și impliciți în TypeScript

Funcții TypeScript 1.0

Un parametru cu ? poate lipsi la apel (devine undefined); unul cu = valoare primește valoarea implicită.

Sintaxă
function f(a: string, b?: number) { ... }        // b: number | undefined
function g(a: string, b: number = 10) { ... }   // b are valoare implicită

Ce face parametri opționali și impliciți

Un parametru marcat cu ? este opțional: apelul îl poate omite, iar în funcție valoarea lui este undefined. De aceea tipul lui în interiorul funcției este number | undefined și trebuie verificat înainte de folosire.

Un parametru cu valoare implicită (b: number = 10) este și el opțional, dar dacă lipsește (sau primește undefined) ia valoarea dată. În funcție are tipul simplu, fără undefined. Tipul poate lipsi: b = 10 deduce number.

Parametrii opționali stau după cei obligatorii. Cei cu valoare implicită pot sta oriunde, dar dacă sunt la mijloc, ca să folosești valoarea implicită trebuie să dai explicit undefined. Pentru multe opțiuni, un singur parametru obiect cu proprietăți opționale este mai ușor de folosit.

Exemple

Exemplul 1: Opțional și implicit

function salut(nume: string, titlu?: string): string {
    return titlu ? `Bună ziua, ${titlu} ${nume}!` : `Salut, ${nume}!`;
}

function pret(suma: number, moneda = "lei", zecimale: number = 2): string {
    return `${suma.toFixed(zecimale)} ${moneda}`;
}

console.log(salut("Ana"));
console.log(salut("Ionescu", "doamna"));
console.log(pret(12.5));
console.log(pret(12.5, "euro"));
console.log(pret(12.5, undefined, 0));

Rezultat

Salut, Ana!
Bună ziua, doamna Ionescu!
12.50 lei
12.50 euro
13 lei

Exemplul 2: Obiect cu opțiuni

Destructurarea cu valori implicite dă fiecărei opțiuni o valoare, iar apelul spune clar ce schimbă.

interface Optiuni {
    separator?: string;
    majuscule?: boolean;
}

function listeaza(elemente: string[], { separator = ", ", majuscule = false }: Optiuni = {}): string {
    const text = elemente.join(separator);
    return majuscule ? text.toUpperCase() : text;
}

const orase = ["Iași", "Cluj", "Brașov"];
console.log(listeaza(orase));
console.log(listeaza(orase, { separator: " / " }));
console.log(listeaza(orase, { majuscule: true }));

Rezultat

Iași, Cluj, Brașov
Iași / Cluj / Brașov
IAȘI, CLUJ, BRAȘOV

Exemplul 3: Parametrul opțional trebuie verificat

function lungime(text?: string): number {
    return text.length;
}
console.log(lungime());

Eroarea afișată de tsc

exemplu.mts(2,12): error TS18048: 'text' is possibly 'undefined'.

Greșeli frecvente

  • Pui un parametru opțional înaintea unuia obligatoriu: f(a?: number, b: number). tsc dă A required parameter cannot follow an optional parameter.
  • Folosești valoare || implicit în loc de valoare implicită; un argument 0 sau "" este înlocuit greșit.

Comenzi înrudite

  • funcții cu tipuri: Pui tipuri pe parametrii și pe rezultatul funcțiilor; fiecare apel este verificat la compilare.
  • rest parameters: Strâng oricâte argumente într-un tablou: …valori: number[] acceptă f(1), f(1, 2, 3) sau f().
  • null și undefined: Cu strictNullChecks, null și undefined sunt tipuri separate: o variabilă le acceptă doar dacă tipul ei le include.
  • Partial: Partial<T> face toate proprietățile lui T opționale; util pentru actualizări în care trimiți doar ce se schimbă.