Búsqueda de sitios web

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.