Môžete mať voliteľné deštrukturalizované argumenty vo funkcii v Typescripte?


Rád by som napísal funkciu, ktorá prijíma argument typu objekt, používa deštrukturalizáciu v podpise funkcie a tento argument je voliteľný:

myFunction({opt1, opt2}?: {opt1?: boolean, opt2?: boolean})

Avšak TypeScript mi to nedovolí („Parameter viazacieho vzoru nemôže byť voliteľný v implementačnom podpise.“).

Samozrejme, že by som to mohol urobiť, keby som nerozštrukturalizoval:

myFunction(options?: {opt1?: boolean, opt2?: boolean}) {
  const opt1 = options.opt1;
  const opt2 = options.opt1;
  ...

Zdá sa, že by to malo byť to isté, no horný príklad nie je povolený.

Rád by som použil deštrukturovanú syntaktiku (1), pretože existuje, je to pekná syntaktika a zdá sa prirodzené, že dve vyššie uvedené funkcie by mali fungovať rovnako, a (2) pretože tiež chcem stručný spôsob, ako špecifikovať predvolené hodnoty:

myFunction({opt1, opt2 = true}?: {opt1?: boolean, opt2?: boolean})

Bez deštrukturalizácie musím tieto predvolené hodnoty zakopať do implementácie funkcie alebo mať argument, ktorý je v skutočnosti nejaká trieda s konštruktorom...

Odpoveď č. 1

Použite namiesto toho predvolený parameter:

function myFunction({ opt1, opt2 = true }: { opt1?: boolean; opt2?: boolean; } = {}) {
    console.log(opt2);
}

myFunction(); // outputs: true

Je to potrebné, aby sme nerozkladali undefined:

function myFunction({ opt1, opt2 }) {
}
    
// Uncaught TypeError: Cannot destructure property `opt1` of 'undefined' or 'null'.
myFunction();

Odpoveď č. 2

Nemôžete robiť destrukturalizáciu, ak nie je ako argument zadaný objekt. Preto použite predvolený objekt v parametroch, ako bolo spomenuté v predchádzajúcom príspevku:

type Options = { opt1?: boolean; opt2?: boolean; }

function myFunction({ opt1, opt2 }: Options = {}) {
    console.log(opt2, opt1);
}

myFunction() // undefined,  undefined 
myFunction({opt1: false}); // undefined,  false 
myFunction({opt2: true}); // true,  undefined

Čo by som chcel pridať, je, že tento vzor deštrukturalizácie v parametroch prináša najväčšiu hodnotu, keď platia nasledujúce 2 podmienky:

  • Počet možností sa pravdepodobne zmení
  • V API funkcie môže dôjsť k potenciálnej zmene, t.j. parametre funkcie sa pravdepodobne zmenia

V podstate deštrukturalizácia vám poskytuje väčšiu flexibilitu, pretože môžete pridať toľko možností, koľko chcete, s minimálnou zmenou rozhrania funkcie.

Avšak základnejšia verzia by bola jednoduchšia:

// If the function is not likely to change often just keep it basic:
function myFunctionBasic( opt1? :boolean, opt2?: boolean ) {
    console.log(opt2, opt1);
}

Súvisiace články