Tipos Unión e Intersección
Las uniones de tipo son una forma de declarar que un
objeto podría ser de más de un tipo.
// Si el uso de "open" y "closed" frente a una cadena es
nuevo para ti, miresé: example:literals
Podemos mezclar diferentes tipos en una unión, y con ello
decir que el valor es uno de esos tipos.
TypeScript te dejará entonces averiguar cómo determinar
qué valor podría ser en tiempo de ejecución.
Las uniones pueden a veces ser socavadas por el
ensanchamiento del tipo, por ejemplo:
type StringOrNumber = string | number;
type ProcessStates = "open" | "closed";
type OddNumbersUnderTen = 1 | 3 | 5 | 7 | 9;
type AMessyUnion = "hello" | 156 | { error: true };
// Si inspecciona arriba, podrá ver que WindowStates
se convierte en una cadena - no en la unión. Esto es
explicado en example:type-widening-and-narrowing
Si una unión es una operación OR, entonces una intersección
es una operación AND. Las intersecciones de tipo son cuando
dos tipos se cruzan para crear un nuevo tipo. Esto permite
la composición del tipo.
type WindowStates = "open" | "closed" | "minimized" | string;
// Estas interfaces pueden estar compuestas por respuestas
que tienen tanto un manejo consistente de errores como
sus propios datos.
interface ErrorHandling {
success: boolean;
error?: { message: string };
}
interface ArtworksData {
artworks: { title: string }[];
}
interface ArtistsData {
artists: { name: string }[];
}
// Una mezcla de tipos de Intersección y Unión se vuelve
realmente útil cuando tienes casos en los que un objeto
tiene que incluir uno de dos valores:
type ArtworksResponse = ArtworksData & ErrorHandling;
type ArtistsResponse = ArtistsData & ErrorHandling;
// Por ejemplo:
const handleArtistsResponse = (response: ArtistsResponse) => {
if (response.error) {
console.error(response.error.message);
return;
}
console.log(response.artists);
};
// Ahora sólo puedes crear una petición cuando incluyes
artistID y los campos html o markdown
interface CreateArtistBioBase {
artistID: string;
thirdParty?: boolean;
}
type CreateArtistBioRequest = (CreateArtistBioBase & { html: string }) | { markdown: string };
const workingRequest: CreateArtistBioRequest = {
artistID: "banksy",
markdown: "Banksy is an anonymous England-based graffiti artist...",
};
const badRequest: CreateArtistBioRequest = {
artistID: "banksy",
};