Indexed Types
Existem situações em que você se encontra duplicando
tipos, um exemplo comum são recursos aninhados em uma
resposta de API gerada automaticamente.
// Se essa interface fosse feita manualmente, é fácil imaginar
que as obras seriam separadas em uma interface como:
interface ResultadosBuscaDeObras {
artistas: {
nome: string;
obras: {
nome: string;
dataFalecimento: string | null;
bio: string;
}[];
}[];
}
// No entanto, nesse caso não temos controle da API e, se
criarmos a interface manualmente, é possível que o campo
obras em ResultadosBuscaDeObras e Obras fiquem defasados
quando houver uma mudança na resposta.
Para resolver esse problema utilizamos tipos indexados,
que replicam como JavaScript permite acessar propriedades
de objetos via strings.
interface Obras {
nome: string;
dataFalecimento: string | null;
bio: string;
}
// A interface ObrasInferidas é gerada percorrendo as
propriedades do tipo e dando um novo nome ao subconjunto
que você indexou.
type ObrasInferidas = ResultadosBuscaDeObras["artistas"][0]["obras"][0];