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 isString deve ter assinatura (value: string | number): value is string.
  • O programa deve testar com pelo menos um string e um number.
  • 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

  1. Declaramos isString com retorno value is string. Isso diz ao TypeScript que, quando a função retornar true, o argumento é do tipo string.
  2. Dentro da função, usamos typeof value === 'string', um guard nativo, para verificar o tipo em tempo de execução.
  3. Criamos duas variáveis do tipo união string | number.
  4. No primeiro if, chamamos isString(a). Como a é 'hello', o predicado retorna true e o TypeScript estreita a para string dentro do bloco.
  5. Usamos a.toUpperCase() com segurança, pois o compilador sabe que é string.
  6. No else, o tipo é number, então usamos a * 2.
  7. Repetimos para b, que é 42. O predicado retorna false, então cai no else e imprime 84.

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): boolean não estreita o tipo; dentro do if, a continua string | number e a.toUpperCase() gera erro.
  • Retornar algo que não é booleano: o predicado deve retornar boolean; se retornar value diretamente, o TypeScript pode não inferir corretamente.
  • Usar isString fora de um contexto condicional: o estreitamento só ocorre em if, 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