Médio TypeScript

Tratando null com strictNullChecks

Enunciado

Crie uma função obterComprimento que recebe uma string ou null e retorna o comprimento da string. Se for null, retorne 0. O código deve compilar com strictNullChecks ativo.

Requisitos

  • A função deve se chamar obterComprimento.
  • O parâmetro deve ser do tipo string | null.
  • O retorno deve ser number.
  • Deve tratar o caso null retornando 0.

Código inicial

// Complete a função para lidar com null e compilar com strictNullChecks.
function obterComprimento(texto) {
  return texto.length;
}

console.log(obterComprimento("TypeScript"));
console.log(obterComprimento(null));

Saída esperada

10
0
Ver dica

Use uma verificação if (texto === null) antes de acessar .length.

Mostrar solução
// Função que aceita string ou null e trata o caso nulo.
function obterComprimento(texto: string | null): number {
  if (texto === null) {
    return 0; // retorno explícito para null
  }
  return texto.length; // agora o TypeScript sabe que texto é string
}

console.log(obterComprimento("TypeScript")); // 10
console.log(obterComprimento(null)); // 0

Passo a passo

  1. Declaramos a função obterComprimento com parâmetro texto: string | null.
  2. O tipo de retorno é number.
  3. Dentro da função, verificamos se texto === null.
  4. Se for nulo, retornamos 0 imediatamente.
  5. Após o if, o TypeScript estreita o tipo de texto para string.
  6. Acessamos texto.length com segurança e retornamos o valor.
  7. Chamamos a função com uma string e com null para testar.

Por que funciona

Com strictNullChecks, null não é atribuível a string. O compilador força você a verificar se o valor é nulo antes de usá-lo como string. A verificação if (texto === null) faz o type narrowing, e a partir daí o TypeScript sabe que texto é string. Isso evita erros em tempo de execução como Cannot read property 'length' of null.

Erros comuns

  • Acessar .length diretamente: return texto.length; gera erro: "Object is possibly 'null'".
  • Usar ! (non-null assertion): return texto!.length; compila, mas pode quebrar em tempo de execução se texto for null.
  • Esquecer de anotar o parâmetro: function obterComprimento(texto) { ... } com strict ativo gera erro de noImplicitAny.

Outra forma de resolver

Você pode usar o operador de coalescência nula (??) para um código mais conciso:

function obterComprimento(texto: string | null): number {
  return texto?.length ?? 0;
}

Isso é preferível quando a lógica é simples e não requer múltiplos passos.

Saída esperada

10
0