Fácil TypeScript
Narrowing com typeof
Enunciado
Escreva uma função formatarValor que recebe um parâmetro valor do tipo string | number. Se for string, retorne a string em maiúsculas; se for number, retorne o número com duas casas decimais como string.
Requisitos
- Usar
typeofpara verificar o tipo. - Retornar
stringem ambos os casos. - A função deve compilar sem erros de tipo.
Código inicial
function formatarValor(valor: string | number): string {
// Seu código aqui
}
console.log(formatarValor('typescript'));
console.log(formatarValor(3.1415));
Saída esperada
TYPESCRIPT
3.14
Ver dica
Use typeof valor === 'string' para estreitar o tipo. Lembre-se de que toFixed existe em números.
Mostrar solução
function formatarValor(valor: string | number): string {
if (typeof valor === 'string') {
return valor.toUpperCase(); // valor é string
}
return valor.toFixed(2); // valor é number
}
console.log(formatarValor('typescript')); // TYPESCRIPT
console.log(formatarValor(3.1415)); // 3.14
Passo a passo
- A função recebe um parâmetro
valorque pode serstringounumber. - Usamos
typeof valor === 'string'para verificar se é string. - Dentro do
if, o TypeScript estreitavalorparastring, permitindo chamartoUpperCase(). - Fora do
if, o TypeScript sabe quevalorsó pode sernumber, entãotoFixed(2)é válido. - Retornamos o resultado formatado em cada caso.
Por que funciona
O typeof é um operador que retorna uma string indicando o tipo primitivo do operando. O TypeScript entende essa verificação como um guarda de tipo, refinando a união string | number para o tipo específico dentro de cada ramo do fluxo.
Erros comuns
- Esquecer de tratar o caso
numbere tentar chamartoUpperCase()fora doif:
return valor.toUpperCase(); // Erro: Property 'toUpperCase' does not exist on type 'number' - Usar
==em vez de===pode não estreitar corretamente em alguns casos. - Não retornar em todos os caminhos: o TypeScript pode reclamar que a função não retorna
stringem todos os casos.
Outra forma de resolver
Usar um switch com typeof:
function formatarValor(valor: string | number): string {
switch (typeof valor) {
case 'string': return valor.toUpperCase();
case 'number': return valor.toFixed(2);
default: throw new Error('Tipo não suportado');
}
}
Útil quando há mais de dois tipos possíveis.
Saída esperada
TYPESCRIPT
3.14