Aprenda / TypeScript do zero

IntermediárioAula 10 de 1415 min0% da trilha

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.

Quiz rápido

O que a flag strict do tsconfig.json realmente representa?
Sem strictNullChecks ativado, o que o TypeScript deixa passar sem erro?