es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

TypeScript: ¿Por qué una unión de una función solo acepta una intersección del parámetro?

Demostraré mi pregunta con un ejemplo simple:

class Foo {
    foo() { }
}

class Bar {
    bar() { }
}

type FooHandler = (arg: Foo) => void;
type BarHandler = (arg: Bar) => void;

type AnyHandler = FooHandler | BarHandler;
declare var handler: AnyHandler;

handler(new Foo()); // El argumento de tipo 'Foo' no se puede asignar al parámetro de tipo 'Foo & Bar'.

¿Por qué handler solo acepta la intersección Foo & Bar y no la unión Foo | Bar? ¿Hay alguna forma de lograr esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la que handler solo acepta la intersección Foo & Bar y no la unión Foo | Bar es porque AnyHandler es una unión de FooHandler y BarHandler, lo que significa que solo puede aceptar argumentos que satisfagan FooHandler o BarHandler. En este caso, handler espera una función que tome un argumento de tipo Foo & Bar, que es un tipo de intersección que requiere que el argumento tenga tanto las propiedades de Foo como las de Bar.

    Para lograr esto, podemos definir un nuevo tipo que combine Foo y Bar usando un tipo de intersección, de la siguiente manera:

    type FooBar = Foo & Bar;
    

    Luego podemos definir un nuevo tipo que acepte una función que tome un argumento de tipo FooBar, así:

    type FooBarHandler = (arg: FooBar) => void;
    

    Finalmente, podemos redefinir AnyHandler como una unión de FooHandler, BarHandler y FooBarHandler, de la siguiente manera:

    type AnyHandler = FooHandler | BarHandler | FooBarHandler;
    

    Con esta nueva definición de AnyHandler, ahora podemos pasar tanto un Foo, un Bar o un objeto que cumpla con tanto Foo como Bar a handler.

Comments are closed.