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
Pickpara criarResumoFuncionario. - Use
Omitpara criarFuncionarioSemSalario. - A função
imprimirResumodeve aceitarResumoFuncionarioe 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
- Definimos a interface
Funcionariocom quatro campos. Pick<Funcionario, "id" | "nome">gera um novo tipo com apenas essas duas chaves.Omit<Funcionario, "salario">gera um tipo com todas as chaves excetosalario.- A função
imprimirResumorecebeResumoFuncionarioe usa template string para formatar a saída. - 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 acessarnome: o compilador acusa quenomenão existe no tipo. - Passar um objeto com
salarioparaimprimirResumo: o excesso de propriedades gera erro em literais de objeto. - Esquecer as aspas nas chaves:
Pick<Funcionario, id>referenciaria uma variávelid, 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