TypeScript: Weglaten van de laatste parameter van een generieke functie wanneer het type ervan undefined is
Is het mogelijk om TypeScript zo te configureren dat het weglaten van de laatste parameter van een generieke functie is toegestaan als het type van de laatste parameter undefined is (maar niet als dat niet zo is)?
Voorbeeld :
type Events = {
readonly first: { readonly foo: string};
readonly second: undefined;
}
const sendEvent = <Name extends keyof Events>(name: Name, payload: Events[Name]) => {
console.log(`SEND EVENT "${name}"`, name, payload);
}
sendEvent('first', { foo: 'bar'}); // <-- OK
sendEvent('second', undefined); // <-- OK
sendEvent('first'); // <-- Error as expected, Events["first"] isn't undefined,
// that's good
sendEvent('second'); // <-- Error: 'Expected 2 arguments, but got 1.'
// would like to not have an error here, since
// Events["second"] is undefined
Antwoord #1
Als je dat alleen wilt toestaan wanneer name "second" is en niet wanneer het "first" is, kun je niet gewoon een optionele parameter gebruiken. Maar je kunt controleren of de payload undefined is, en als dat zo is, maak je de tweede parameter optioneel door het tweede element in de tuple optioneel te maken:
const sendEvent = <Name extends keyof Events>(
...[name, payload]: (Events[Name] extends undefined ? [name: Name, payload?: Events[Name]] : [name: Name, payload: Events[Name]])
) => {
Iets lang, maar het werkt, vooral als je meer evenementen hebt.
Speelplaats
