//
Busque em todas as páginas da documentação
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Escreva código React que prospere sob as configurações mais rigorosas do TypeScript. Domine padrões para strictNullChecks, noUncheckedIndexedAccess e exactOptionalPropertyTypes para capturar bugs que configurações mais flexíveis não pegam.
// strictNullChecks: tratamento seguro de valores anuláveis
type User = {
id: string;
name: string;
address?: {
street: string;
city: string;
};
};
function UserAddress({ user }: { user: User }) {
// Sem strictNullChecks, isso retorna undefined silenciosamente
// Com strictNullChecks, o TypeScript força você a lidar com o caso
if (!user.address) {
return <p>Nenhum endereço registrado</p>;
}
return (
<p>
{user.address.street}, {user.address.city}
</p>
);
}// noUncheckedIndexedAccess: acesso seguro a arrays e objetos
const colors = ["red", "green", "blue"];
// Sem noUncheckedIndexedAccess: colors[5] é string
// Com noUncheckedIndexedAccess: colors[5] é string | undefined
function getColor(index: number): string {
const color = colors[index];
if (!color) {
return "default";
}
return color; // TypeScript agora sabe que isso é string, não string | undefined
}// Acesso seguro a registros
type FeatureFlags = Record<string, boolean>;
function isFeatureEnabled(flags: FeatureFlags, key: string): boolean {
const value = flags[key];
// Com noUncheckedIndexedAccess, value é boolean | undefined
return value ?? false;
}strict: true habilita uma família de verificações rigorosas. As mais impactantes para React são strictNullChecks, strictFunctionTypes e noImplicitAny.strictNullChecks torna null e undefined tipos distintos que devem ser tratados explicitamente. Uma variável tipada como string não pode ser null a menos que você a tipifique como string | null.noUncheckedIndexedAccess adiciona | undefined a qualquer acesso de índice em arrays e registros. Isso captura o bug comum de acessar um índice de array que pode estar fora dos limites.exactOptionalPropertyTypes distingue entre uma propriedade que está ausente e uma que é explicitamente undefined. { name?: string } significa "o nome pode estar ausente", mas não { name: undefined }.strictFunctionTypes impõe verificação contravariante de parâmetros em tipos de função. Isso captura bugs sutis com tipos de manipuladores de eventos e props de callback.Pesquisas seguras em mapas/objetos:
const userMap = new Map<string, User>();
function getUser(id: string): User {
const user = userMap.get(id); // User | undefined
if (!user) {
throw new Error(`Usuário ${id} não encontrado`);
}
return user; // Restrito para User
}Asserção non-null como saída de emergência:
// Use com moderação e apenas quando tiver certeza de que o valor existe
const canvas = document.getElementById("canvas") as HTMLCanvasElement;
const ctx = canvas.getContext("2d")!; // Asserção non-null
// Melhor: usar guarda e lançar exceção
const ctx2 = canvas.getContext("2d");
if (!ctx2) throw new Error("Contexto 2D do canvas não disponível");Tratando encadeamento opcional com nulls estritos:
type Config = {
api?: {
baseUrl?: string;
timeout?: number;
};
};
function getApiUrl(config: Config): string {
return config.api?.baseUrl ?? "https://api.example.com";
}exactOptionalPropertyTypes em ação:
// Com exactOptionalPropertyTypes habilitado:
type Settings = {
theme?: "light" | "dark";
};
// Permitido
const a: Settings = {};
const b: Settings = { theme: "light" };
// Erro: undefined não é atribuível a "light" | "dark"
// const c: Settings = { theme: undefined };strict: true, depois noUncheckedIndexedAccess, depois exactOptionalPropertyTypes.?? (coalescência nula) e ?. (encadeamento opcional) são suas melhores ferramentas sob configurações estritas. Eles lidam com null | undefined de forma limpa.Array.prototype.find() retorna T | undefined mesmo sem noUncheckedIndexedAccess. A configuração afeta principalmente o acesso por colchetes arr[i].noUncheckedIndexedAccess adiciona | undefined ao acesso de tuplas também. Para tuplas com comprimento conhecido, isso pode parecer excessivamente cauteloso. Use desestruturação em vez disso: const [first, second] = tuple.exactOptionalPropertyTypes quebra o código que passa explicitamente undefined para limpar campos opcionais. Você pode precisar usar delete obj.field em vez disso.!) ignoram as verificações estritas completamente. Cada ! é um potencial crash em tempo de execução. Prefira guards e narrowing.skipLibCheck: true ajuda, mas esconde problemas em seus próprios arquivos .d.ts.| Abordagem | Prós | Contras |
|---|---|---|
strict: true + noUncheckedIndexedAccess | Segurança máxima, captura a maioria dos bugs | Tratamento de nulos mais verboso |
Apenas strict: true | Bom equilíbrio entre segurança e conveniência | Perde bugs de array fora dos limites |
strict: false com sinalizadores incrementais | Caminho de migração gradual | Fácil de perder verificações importantes |
| Validação em tempo de execução (Zod) | Captura problemas que o modo estrito não pode | Dependência adicional, sobrecarga em tempo de execução |
Asserções as para contornar a rigidez | Correção rápida para erros de tipo | Anula o propósito do modo estrito |
strictNullChecks, strictFunctionTypes, noImplicitAny, strictBindCallApply, strictPropertyInitialization, e outros.strictNullChecks, strictFunctionTypes e noImplicitAny.string não pode mais ser null ou undefined, a menos que seja explicitamente tipada como string | null.| undefined a qualquer acesso de índice em arrays e registros.colors[5] se torna string | undefined em vez de string.type Settings = { theme?: "light" | "dark" };
const a: Settings = {}; // OK: propriedade ausente
const b: Settings = { theme: "light" }; // OK
// const c: Settings = { theme: undefined }; // ERROundefined são tratados como distintos.undefined a um campo opcional.! é um potencial crash em tempo de execução se o valor for realmente null ou undefined.?.) ou coalescência nula (??) em vez disso.| undefined no acesso por colchetes.const [first, second] = tuple evita o | undefined.const colors = ["red", "green", "blue"];
function getColor(index: number): string {
const color = colors[index]; // string | undefined
if (!color) return "default";
return color; // restrito para string
}undefined após o acesso ao índice.?? para fornecer valores de fallback.strict: true (habilita a família principal de verificações).noUncheckedIndexedAccess (adiciona segurança de índice).exactOptionalPropertyTypes (manuseio mais rigoroso de propriedades opcionais).strictNullChecks ou exactOptionalPropertyTypes em mente.skipLibCheck: true ajuda verificando os arquivos .d.ts..d.ts.?. encurta para undefined se o lado esquerdo for null ou undefined: config.api?.baseUrl.?? fornece um fallback apenas para null ou undefined: value ?? "default".||, ?? não é acionado por valores falsy como 0 ou "".Revisado por Chris St. John·Última atualização: 7 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥