TypeScript zahtijeva oba parametra ili nijedan


Postoji li način da se definira funkcija koja zahtijeva da se ili oba uvjetna parametra daju, ili nijedan? Na primjer:

function greet(firstName?: string, lastName?: string) {
  if (fistName && lastName) console.log(`Hello, ${firstName} ${lastName}!`)
  else console.log('Hello, World!')
}

greet('John', 'Doe') // Hello, John Doe!
greet() // Hello, World!
greet('John') // Invalid

Shvaćam da bih mogao jednostavno koristiti destrukturiranje objekta, stvoriti dvije metode ili dodati više if izjava, ali sam znatiželjan vidjeti je li ovo moguće. Hvala!

Odgovor #1

Možete koristiti preopterećenje za tip funkcije:

type Greet = {
     (firstName: string, lastName: string): void;
     (): void;
};
const greet: Greet = (firstName?: string, lastName?: string) => {
  if (firstName && lastName) console.log(`Hello, ${firstName} ${lastName}!`)
  else console.log('Hello, World!')
};

greet('John', 'Doe'); // Hello, John Doe!
greet(); // Hello, World!
greet('John'); // Invalid

Veza za igralište

Ipak, malo je repetitivno i prilično ružno. Iako izvedivo, radije bih koristio odvojene funkcije kad god je to moguće.

Sličan pristup, koristeći objekt umjesto odvojenih parametara:

type GreetParam = {
     firstName: string;
     lastName: string;
};
const greet = (param?: GreetParam) => {
  if (param) console.log(`Hello, ${param.firstName} ${param.lastName}!`)
  else console.log('Hello, World!')
};

greet({ firstName: 'John', lastName: 'Doe' }); // Hello, John Doe!
greet(); // Hello, World!
greet({ firstName: 'John' }); // Invalid
greet({}); // Invalid