FNSP Web Page

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ês

A 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.

Comentários

Ainda ninguém comentou este artigo.

Voltar ao blog

Gostávamos de saber quantas pessoas visitam o site, com o Google Analytics. Sem a sua autorização não corre nada. Política de Privacidade.