strictBindCallApply în TypeScript

Verifică argumentele trimise prin bind, call și apply după tipurile funcției originale.

Sintaxă
"compilerOptions": { "strictBindCallApply": true }

tsc --strictBindCallApply

Ce face strictBindCallApply

call, apply și bind apelează o funcție cu un anumit this și cu argumentele date. Fără opțiune, TypeScript le tratează ca primind orice (any), deci un argument greșit trece. Cu strictBindCallApply, argumentele sunt verificate la fel ca la un apel normal.

Pentru apply, tabloul de argumente este verificat ca un tuplu: număr și tipuri. Pentru bind, funcția obținută primește tipul cu parametrii rămași.

Implicit este false, dar devine true când strict este true.

Parametri

Parametru Descriere
true Activează verificarea.
false Dezactivează verificarea, chiar dacă "strict": true.
(lipsă) Ia valoarea lui strict: activă dacă strict este true, altfel inactivă.

Exemple

Exemplul 1: Argumente greșite prin call, bind și apply

Toate trei apelurile au o greșeală: un text în loc de număr, un boolean în loc de număr și un argument lipsă.

// tsconfig.json
{
  "compilerOptions": {
    "strictBindCallApply": true,
    "target": "es2022"
  }
}

// index.ts
function factura(client: string, suma: number) {
  return `${client}: ${suma} lei`;
}

console.log(factura.call(undefined, "Ana", "120"));
const pentruIon = factura.bind(undefined, "Ion");
console.log(pentruIon(true));
console.log(factura.apply(undefined, ["Maria"]));

Rezultat (tsc 5.9)

$ npx tsc --noEmit
index.ts(5,44): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
index.ts(7,23): error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'number'.
index.ts(8,38): error TS2345: Argument of type '[string]' is not assignable to parameter of type '[client: string, suma: number]'.
  Source has 1 element(s) but target requires 2.

Exemplul 2: Apeluri corecte

Cu argumentele potrivite, codul trece și rulează. Funcția dată de bind mai cere doar suma.

function factura(client: string, suma: number): string {
  return `${client}: ${suma} lei`;
}

console.log(factura.call(undefined, "Ana", 120));
const pentruIon = factura.bind(undefined, "Ion");
console.log(pentruIon(75.5));
console.log(factura.apply(undefined, ["Maria", 300]));

Rezultat

Ana: 120 lei
Ion: 75.5 lei
Maria: 300 lei

Greșeli frecvente

  • Să folosești apply cu un tablou de tip string[] pentru o funcție cu parametri fixi. Tabloul trebuie să fie un tuplu (de exemplu scris direct sau cu as const).
  • În cod nou, call/apply sunt rareori necesare: apelul direct sau operatorul spread (f(...args)) sunt mai clare.

Comenzi înrudite

  • strict: Pornește dintr-o singură mișcare toate verificările stricte de tipuri (strictNullChecks, noImplicitAny și celelalte).
  • strictFunctionTypes: Verifică corect parametrii când atribui o funcție altui tip de funcție (fără bivarianță la parametri).
  • noImplicitThis: Dă eroare când this este folosit într-o funcție unde tipul lui nu se știe (ar fi any).