Médio TypeScript

Seleção e omissão de campos

Enunciado

Dado o tipo Funcionario com id, nome, cargo e salario, crie dois tipos: ResumoFuncionario que contém apenas id e nome, e FuncionarioSemSalario que contém todos os campos exceto salario. Depois, escreva uma função imprimirResumo que recebe um ResumoFuncionario e imprime "ID: X, Nome: Y".

Requisitos

  • Use Pick para criar ResumoFuncionario.
  • Use Omit para criar FuncionarioSemSalario.
  • A função imprimirResumo deve aceitar ResumoFuncionario e imprimir no formato indicado.

Código inicial

interface Funcionario {
  id: number;
  nome: string;
  cargo: string;
  salario: number;
}

// Defina ResumoFuncionario e FuncionarioSemSalario

function imprimirResumo(f: ResumoFuncionario): void {
  // seu código aqui
}

imprimirResumo({ id: 10, nome: "Joana" });

Saída esperada

ID: 10, Nome: Joana
Ver dica

Pick<Funcionario, 'id' | 'nome'> e Omit<Funcionario, 'salario'>.

Mostrar solução
interface Funcionario {
  id: number;
  nome: string;
  cargo: string;
  salario: number;
}

type ResumoFuncionario = Pick<Funcionario, "id" | "nome">;
type FuncionarioSemSalario = Omit<Funcionario, "salario">;

function imprimirResumo(f: ResumoFuncionario): void {
  console.log(`ID: ${f.id}, Nome: ${f.nome}`);
}

imprimirResumo({ id: 10, nome: "Joana" });

Passo a passo

  1. Definimos a interface Funcionario com quatro campos.
  2. Pick<Funcionario, "id" | "nome"> gera um novo tipo com apenas essas duas chaves.
  3. Omit<Funcionario, "salario"> gera um tipo com todas as chaves exceto salario.
  4. A função imprimirResumo recebe ResumoFuncionario e usa template string para formatar a saída.
  5. Chamamos a função com um objeto literal que satisfaz o tipo.

Por que funciona

Pick e Omit são operações de mapeamento de tipos que não alteram o tipo original. Eles permitem criar visões especializadas sem duplicar a interface. Se Funcionario mudar, os tipos derivados se atualizam automaticamente.

Erros comuns

  • Usar Pick<Funcionario, "id"> e tentar acessar nome: o compilador acusa que nome não existe no tipo.
  • Passar um objeto com salario para imprimirResumo: o excesso de propriedades gera erro em literais de objeto.
  • Esquecer as aspas nas chaves: Pick<Funcionario, id> referenciaria uma variável id, não a chave.

Outra forma de resolver

Definir os tipos manualmente:

type ResumoFuncionario = { id: number; nome: string };

É preferível quando o tipo base não deve influenciar o derivado, mas perde a sincronia automática.

Saída esperada

ID: 10, Nome: Joana