tsconfig.json e o que o modo strict realmente liga
strict: true não é uma flag isolada — é um pacote de várias, e cada uma pega um tipo de bug diferente.
É comum ver gente desligando strict num projeto TypeScript pra "parar de dar tanto erro", sem saber exatamente o que está desligando junto. strict não é um único comportamento — é um atalho que liga várias checagens independentes de uma vez.
tsconfig.json — onde o compilador é configurado
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"strict": true,
"skipLibCheck": true
}
}Esse arquivo controla como o tsc (ou o Next.js, por baixo) compila e checa o projeto. A maioria das opções liga ou desliga um tipo específico de checagem — e strict é a mais importante delas.
strict não é uma flag, é um pacote
Marcar "strict": true equivale a ligar, de uma vez, um grupo de flags menores — entre as mais relevantes no dia a dia:
// o que "strict": true liga por baixo (versão simplificada):
// noImplicitAny — parâmetro sem tipo não vira "any" silencioso
// strictNullChecks — null/undefined não se encaixam em qualquer tipo
// strictFunctionTypes — checagem mais rígida de parâmetros de função
// strictPropertyInitializer — campo de classe não pode ficar sem valor inicial
// noImplicitThis — "this" sem tipo definido vira erro, não "any"noImplicitAny — o parâmetro que virava any sem avisar
// com noImplicitAny desligado, isso compila sem erro nenhum:
function formatar(valor) {
return valor.toUpperCase(); // "valor" é any — TS não checa nada aqui
}
// com noImplicitAny ligado (dentro de strict), o mesmo código dá erro:
function formatar(valor) {
return valor.toUpperCase();
}
// Error: Parameter 'valor' implicitly has an 'any' type.strictNullChecks — provavelmente a mais importante
Sem essa flag, null e undefined são aceitos em qualquer lugar, mesmo onde o tipo diz string ou number — a origem clássica de "Cannot read properties of undefined" em produção:
function saudar(nome: string) {
return nome.toUpperCase();
}
let usuario: string | undefined = buscarUsuario();
saudar(usuario);
// com strictNullChecks: Error: Argument of type 'string | undefined' is not
// assignable to parameter of type 'string'.
// sem strictNullChecks: compila normalmente — e quebra em runtime se usuario vier undefined
if (usuario) {
saudar(usuario); // aqui o narrowing já eliminou o "undefined" — TS libera a chamada
}Por que todo projeto novo deveria nascer com strict: true
Ativar strict desde o primeiro commit custa pouco: o projeto ainda não tem código pra migrar. Ativar depois de meses de código escrito sem essas checagens costuma revelar centenas de erros de uma vez — a maioria bugs reais que só não tinham aparecido ainda. Por isso é bem mais barato nascer estrito do que virar estrito depois.
Exercício
Um projeto tem "strict": false no tsconfig. A função function calcular(taxa) { return 100 * taxa; } compila sem nenhum erro, mesmo sem tipo no parâmetro taxa. Explique qual flag dentro de strict pegaria esse problema, e reescreva a função corrigindo.