Tipos derivados: escrever a forma uma vez
A forma mais comum de os tipos e o código se afastarem é a duplicação. Escreve-se a forma de um artigo no modelo, e escreve-se outra vez — quase igual — no formulário, no pedido, na resposta. Depois acrescenta-se um campo num sítio e esquece-se nos outros.
Os tipos utilitários do TypeScript existem para isso: derivar a partir do que já está escrito, em vez de repetir.
1. Os quatro do dia-a-dia
type Artigo = {
id: number;
titulo: string;
corpo: string;
publicadoEm: Date;
};
// O que o formulário de criação envia: tudo menos o id
type ArtigoNovo = Omit<Artigo, 'id'>;
// O que a listagem precisa: só três campos
type ArtigoNaLista = Pick<Artigo, 'id' | 'titulo' | 'publicadoEm'>;
// Uma edição parcial: todos os campos, todos opcionais
type ArtigoEditado = Partial<Artigo>;
// Um dicionário com chaves conhecidas
type ContagemPorTag = Record<'javascript' | 'typescript', number>;Acrescente amanhã um campo resumo ao Artigo e os quatro acompanham sozinhos.
2. Derivar do código, e não só de tipos
O typeof e o ReturnType deixam partir de uma função que já existe. É o que evita descrever à mão o que uma consulta devolve:
async function lerArtigo(id: number) {
return { id, titulo: 'Olá', tags: ['typescript'] };
}
// O tipo da promessa devolvida
type Devolvido = ReturnType<typeof lerArtigo>; // Promise<{...}>
// O tipo já sem a promessa à volta
type ArtigoLido = Awaited<ReturnType<typeof lerArtigo>>;
function mostrar(artigo: ArtigoLido) {
console.log(artigo.titulo); // muda com a função, sem ninguém mexer aqui
}3. E as chaves, quando são o que interessa
const etiquetas = {
rascunho: 'Por publicar',
publicado: 'No ar',
arquivado: 'Arquivado',
};
type EstadoDoArtigo = keyof typeof etiquetas; // 'rascunho' | 'publicado' | 'arquivado'
function mudarPara(estado: EstadoDoArtigo) {
console.log(etiquetas[estado]);
}
mudarPara('publicado'); // ok
mudarPara('apagado');
// ~~~~~~~~~~ Erro: não é um dos trêsA regra que fica: a forma escreve-se uma vez, no sítio onde ela nasce. Tudo o resto deriva dela — e nada volta a ficar para trás numa alteração.