La unión de 2 interfaces en Typescript permite código ambiguo
Quiero un array que imponga uno de 2 tipos: A o B donde B extiende A. ¿Cómo hacer esto, por favor?
interface Foo {
x: string;
}
interface Bar extends Foo {
y: string;
z: number;
}
type X = Foo | Bar;
const arr: Array<X> = [
{ x: 'Hello' }, // implements Foo
{ x: 'John', y: 'Doe', z: 42 }, // implements Bar
{ x: 'Hello', y: 'World' }, // i want this to throw an error
];
Gracias :)
Respuesta #1
Typescript no tiene tipos nominales, solo estructurales. Eso significa que un { x: string, y: string } es un Foo perfectamente válido (tiene una clave x con un tipo coincidente, y cualquier código que requiera un Foo puede ignorar de manera segura las otras claves)
Si quieres aplicar y simular tipos nominales, puedes añadir una etiqueta única a tus tipos:
interface Foo {
_type: 'Foo'
x: string
}
Y crea una función para crear fácilmente instancias de Foo con la etiqueta _type adecuada.
