tsconfig.json e o que o modo strict realmente liga
strict: true não é um interruptor único. É um pacote de vários interruptores menores, cada um pegando uma categoria diferente de bug.
Estudar esta lição interativa →Todo projeto TypeScript de verdade tem um arquivo tsconfig.json na raiz, criado normalmente com o comando tsc --init. Ele não muda o que é ou não é JavaScript válido, mas configura quão rigoroso o compilador deve ser ao checar o seu código: onde procurar arquivos, para qual versão de JavaScript compilar, e, o mais importante para quem está aprendendo, quais categorias de erro valem a pena travar.
A opção mais importante desse arquivo é strict. Ligá-la ("strict": true, o padrão recomendado para projetos novos) não liga uma checagem, liga um pacote de várias checagens menores de uma vez:
| Flag dentro de strict | O que passa a ser erro |
|---|---|
noImplicitAny | Um parâmetro sem tipo e sem valor para inferir (como function f(x) {}) deixa de virar any silenciosamente |
strictNullChecks | null e undefined deixam de ser aceitos em qualquer tipo; um valor number | null exige narrowing antes de usar métodos de number |
strictFunctionTypes | A checagem de parâmetros de função passa a ser mais rigorosa ao comparar tipos de função entre si |
alwaysStrict | Todo arquivo compilado é emitido com "use strict" (o modo estrito clássico do JavaScript) |
Um recorte das checagens mais relevantes dentro do pacote strict; a lista completa é maior.
Pense em strict como o quadro de disjuntores de uma casa: em vez de um único interruptor geral, existe um disjuntor separado para cada área (cozinha, quarto, área externa). Ligar "tudo" de uma vez é o jeito recomendado para uma casa nova, mas cada disjuntor também pode ser entendido, e ajustado, individualmente, se um caso específico realmente precisar.
O editor deste curso (a mesma infraestrutura que checa cada célula de código que você roda aqui) usa strict: true, igual ao recomendado num projeto real. Por isso um exemplo como let idade: number | null = null; idade.toFixed(); mostra o diagnóstico 'idade' is possibly 'null' (TS18047) logo ao digitar. Esse erro não é implicância: ele impede o bug clássico de chamar um método num valor que pode não existir.
O padrão de código que strictNullChecks cobra é simples, e você já aprendeu a ferramenta certa para ele no Módulo 6: narrowing. Em vez de assumir que um valor está sempre presente, você testa antes de usar:
// O padrão que strictNullChecks cobra: narrowing antes de usar o valor.
let idadeOuNula: number | null = 30;
function formatarIdade(idade: number | null): string {
if (idade === null) {
return "idade não informada";
}
return idade + " anos"; // aqui, idade só pode ser number
}
console.log(formatarIdade(idadeOuNula));É este padrão que strictNullChecks cobra: testar o null antes de usar o valor.
Num projeto próprio, a sequência é: npm init -y, depois npm i -D typescript (o tsc vem desse pacote, então ele precisa estar instalado), e então npx tsc --init. Nas versões recentes (5.9 em diante), o tsconfig.json gerado já traz "strict": true ativo, junto com checagens extras como noUncheckedIndexedAccess. A recomendação quase unânime da comunidade é deixar ligado desde o primeiro dia: é bem mais fácil manter um projeto estrito desde o início do que apertar o rigor depois, com centenas de arquivos já escritos de um jeito mais permissivo.