Fácil TypeScript
Predicado para string ou number
Enunciado
Crie uma função isString que recebe um valor do tipo string | number e retorna um predicado de tipo value is string. Depois, use-a para imprimir o valor em maiúsculas se for string, ou o dobro se for number.
Requisitos
- A função
isStringdeve ter assinatura(value: string | number): value is string. - O programa deve testar com pelo menos um
stringe umnumber. - A saída deve mostrar a transformação correta para cada tipo.
Código inicial
function isString(value: string | number): value is string {
// implemente
}
const a: string | number = 'hello';
const b: string | number = 42;
// use isString para decidir a transformação
Saída esperada
HELLO
84
Ver dica
Use typeof value === 'string' dentro do predicado.
Mostrar solução
function isString(value: string | number): value is string {
return typeof value === 'string';
}
const a: string | number = 'hello';
const b: string | number = 42;
if (isString(a)) {
console.log(a.toUpperCase()); // a é string
} else {
console.log(a * 2); // a é number
}
if (isString(b)) {
console.log(b.toUpperCase());
} else {
console.log(b * 2);
}
Passo a passo
- Declaramos
isStringcom retornovalue is string. Isso diz ao TypeScript que, quando a função retornartrue, o argumento é do tipostring. - Dentro da função, usamos
typeof value === 'string', um guard nativo, para verificar o tipo em tempo de execução. - Criamos duas variáveis do tipo união
string | number. - No primeiro
if, chamamosisString(a). Comoaé'hello', o predicado retornatruee o TypeScript estreitaaparastringdentro do bloco. - Usamos
a.toUpperCase()com segurança, pois o compilador sabe que é string. - No
else, o tipo énumber, então usamosa * 2. - Repetimos para
b, que é42. O predicado retornafalse, então cai noelsee imprime84.
Por que funciona
O predicado value is string é uma promessa que a função faz ao compilador. Quando o retorno é true, o TypeScript confia e estreita o tipo dentro do bloco condicional. Isso evita casts manuais e mantém a segurança de tipos.
Erros comuns
- Esquecer o
is:function isString(value: string | number): booleannão estreita o tipo; dentro doif,acontinuastring | numberea.toUpperCase()gera erro. - Retornar algo que não é booleano: o predicado deve retornar
boolean; se retornarvaluediretamente, o TypeScript pode não inferir corretamente. - Usar
isStringfora de um contexto condicional: o estreitamento só ocorre emif,while, etc.
Outra forma de resolver
Usar typeof diretamente no if:
if (typeof a === 'string') {
console.log(a.toUpperCase());
} else {
console.log(a * 2);
}
Essa forma é mais direta para casos simples, mas não é reutilizável.
Saída esperada
HELLO
84