TypeScript: Omitir el parámetro final de una función genérica cuando su tipo es undefined
¿Es posible configurar TypeScript para permitir omitir el parámetro final de una función genérica si el tipo del parámetro final es undefined (pero no si no lo es)?
Ejemplo :
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
Respuesta #1
Si solo quieres permitir eso cuando name es "second" y no cuando es "first", no puedes simplemente usar un parámetro opcional. Pero puedes verificar si la carga útil es undefined, y si lo es, hacer que el segundo parámetro sea opcional haciendo que el segundo elemento en la tupla sea opcional:
const sendEvent = <Name extends keyof Events>(
...[name, payload]: (Events[Name] extends undefined ? [name: Name, payload?: Events[Name]] : [name: Name, payload: Events[Name]])
) => {
Un poco largo, pero funciona, especialmente si tienes más eventos.
Parque infantil
