Fácil TypeScript
Formatar ID com union type
Enunciado
Crie uma função formatarId que recebe um parâmetro id do tipo number | string e retorna uma string formatada. Se for número, retorne "ID numérico: X" (com X sendo o número). Se for string, retorne "ID textual: Y" (com Y em maiúsculas). Use narrowing com typeof.
Requisitos
- A função deve aceitar
number | string. - Usar
typeofpara diferenciar os tipos. - Retornar a string no formato correto para cada caso.
Código inicial
function formatarId(id: number | string): string {
// Seu código aqui
}
Saída esperada
ID numérico: 42
ID textual: ABC123
Ver dica
Dentro do if, use typeof id === 'number' para tratar números. No else, o TypeScript já sabe que é string.
Mostrar solução
function formatarId(id: number | string): string {
// Verifica se é number
if (typeof id === 'number') {
return `ID numérico: ${id}`;
}
// Aqui id é string
return `ID textual: ${id.toUpperCase()}`;
}
console.log(formatarId(42));
console.log(formatarId('abc123'));
Passo a passo
- A função recebe
idcom tiponumber | string. - Usamos
typeof id === 'number'para verificar se é número. - Se for número, retornamos a string formatada com o número.
- Caso contrário, o TypeScript infere que
idé string, então usamostoUpperCase().
Por que funciona
O typeof faz o narrowing: dentro do if, o tipo de id é number; no else, é string. Isso permite chamar métodos específicos de cada tipo sem erros de compilação.
Erros comuns
- Esquecer o
typeofe tentar usartoUpperCase()diretamente:id.toUpperCase()causaria erro porquenumbernão tem esse método. - Usar
if (id)para verificar tipo: isso não funciona para narrowing, pois0é falsy.
Outra forma de resolver
Poderia usar Number.isInteger(id) para verificar se é número, mas typeof é mais direto e idiomático.
Saída esperada
ID numérico: 42
ID textual: ABC123