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
nullretornando0.
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
- Declaramos a função
obterComprimentocom parâmetrotexto: string | null. - O tipo de retorno é
number. - Dentro da função, verificamos se
texto === null. - Se for nulo, retornamos
0imediatamente. - Após o
if, o TypeScript estreita o tipo detextoparastring. - Acessamos
texto.lengthcom segurança e retornamos o valor. - Chamamos a função com uma string e com
nullpara 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
.lengthdiretamente: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 setextofornull. - Esquecer de anotar o parâmetro:
function obterComprimento(texto) { ... }comstrictativo gera erro denoImplicitAny.
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