Búsqueda de sitios web

La propiedad de Typescript no existe en una unión


Tengo los siguientes tipos:

Foo {
 foobar: any
}

Bar {
 fooBarBar: any;
}

Una función definida de la siguiente manera:

this.api.submit(param: Foo | Bar)

uso :

this.api.submit(param.foobar) // does not exist on Bar

Error: Property 'foobar' does not exist on type 'Foo| Bar'.
  Property 'foobar' does not exist on type 'Bar '

Mi suposición era que TypeScript determinaría, basándose en la unión, que podría ser cualquiera de estos modelos, entonces ¿por qué se queja en este caso?

Una solución alternativa es usar la notación de corchetes param['foobar'] y el error desaparecerá...

Respuesta #1

Lo que dice tu definición es que param será o Foo o Bar, pero no hay forma de que el compilador decida cuál en el momento en que llamas a param.foobar.

Si quieres poder discriminar, puedes hacer algo como esto:

Foo {
    type: 'foo',
    foobar: any
}

Bar {
    type: 'bar',
    fooBarBar: any;
}
...
if (param.type === 'foo') {
    param.foobar; // the type guard in the if statement guarantees we've got an instance of Foo here
}

Si lo que querías decir es que param será tanto Foo como Bar, necesitas tipos de intersección, es decir: Foo & Bar.

Respuesta #2

Está funcionando como se esperaba.

Si puede ser un tipo con la propiedad foobar o un tipo sin ella, entonces no se garantiza que la propiedad exista.

Así que podrías tener problemas si asumes que existe en cada referencia válida.

Entonces, TypeScript se queja.

Quizás puedas indicar que Bar puede tener una propiedad foobar (potencialmente indefinida) :

Foo {
 foobar: any
}

Bar {
 foobar?: any;
 fooBarBar: any;
}

Deberías usar solo propiedades que sabes que están presentes en todo el tipo unión.

Básicamente, puedes ver el tipo unión como una interfaz que comprende todas las propiedades comunes.