tsconfig.json
assusta todo mundo. É um arquivo enorme com MUITAS opções em potencial.
Mas, na verdade, há apenas algumas opções de configuração com as quais você precisa se preocupar. Vamos descobri-las e criá-las.
Início rápido
Quer só o código? Aqui vai:
{
"compilerOptions": {
/* Base Options: */
"esModuleInterop": true,
"skipLibCheck": true,
"target": "es2022",
"allowJs": true,
"resolveJsonModule": true,
"moduleDetection": "force",
"isolatedModules": true,
"verbatimModuleSyntax": true,
/* Strictness */
"strict": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,
/* If transpiling with TypeScript: */
"module": "NodeNext",
"outDir": "dist",
"sourceMap": true,
/* AND if you're building for a library: */
"declaration": true,
/* AND if you're building for a library in a monorepo: */
"composite": true,
"declarationMap": true,
/* If NOT transpiling with TypeScript: */
"module": "preserve",
"noEmit": true,
/* If your code runs in the DOM: */
"lib": ["es2022", "dom", "dom.iterable"],
/* If your code doesn't run in the DOM: */
"lib": ["es2022"]
}
}
Explicação completa
Opções básicas
Aqui estão as opções básicas que recomendo para todos os projetos.
{
"compilerOptions": {
"esModuleInterop": true,
"skipLibCheck": true,
"target": "es2022",
"allowJs": true,
"resolveJsonModule": true,
"moduleDetection": "force",
"isolatedModules": true,
"verbatimModuleSyntax": true
}
}
esModuleInterop
: Ajuda a consertar algumas barreiras entre o CommonJS e os Módulos ES.skipLibCheck
: Ignora a verificação dos tipos de.d.ts
arquivos. Isso é importante para o desempenho, porque, caso contrário, todosnode_modules
serão verificados.target
: A versão do JavaScript que você está almejando. Recomendoes2022
overesnext
para estabilidade.allowJs
eresolveJsonModule
: Permite que você importe.js
e.json
arquivos. Sempre útil.moduleDetection
: Esta opção força o TypeScript a considerar todos os arquivos como módulos. Isso ajuda a evitar erros ‘ cannot redeclare block-scoped variable ‘.isolatedModules
: Esta opção evita alguns recursos do TS que não são seguros ao tratar módulos como arquivos isolados.verbatimModuleSyntax
: Esta opção força você a usarimport type
andexport type
, levando a um comportamento mais previsível e menos importações desnecessárias. Commodule: NodeNext
, ela também força você a usar a sintaxe de importação correta para ESM ou CJS.
Rigor
Aqui estão as opções de rigor que recomendo para todos os projetos.
{
"compilerOptions": {
"strict": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true
}
}
strict
: Habilita todas as opções de verificação de tipo estrito. Indispensável.noUncheckedIndexedAccess
: Impede que você acesse um array ou objeto sem primeiro verificar se ele está definido. Esta é uma ótima maneira de evitar erros de tempo de execução e realmente deveria ser incluída emstrict
.noImplicitOverride
: Torna aoverride
palavra-chave realmente útil nas aulas.
Muitas pessoas recomendaram as opções de rigor em tsconfig/bases
, um repositório maravilhoso que cataloga as opções do TSConfig. Essas opções incluem muitas regras que considero muito “barulhentas”, como noImplicitReturns
, noUnusedLocals
, noUnusedParameters
, e noFallthroughCasesInSwitch
. Recomendo que você adicione essas regras ao seu tsconfig.json
only se quiser.
Transpilando com TypeScript
Se você estiver transpilando seu código (criando arquivos JavaScript) com tsc
, você vai querer essas opções.
{
"compilerOptions": {
"module": "NodeNext",
"outDir": "dist"
}
}
module
: Informa ao TypeScript qual sintaxe de módulo usar.NodeNext
é a melhor opção para o Node.moduleResolution: NodeNext
está implícito nesta opção.outDir
: Informa ao TypeScript onde colocar os arquivos JavaScript compilados.dist
é minha convenção preferida, mas fica a seu critério.
Edifício para uma biblioteca
Se você estiver construindo para uma biblioteca, você vai querer declaration: true
.
{
"compilerOptions": {
"declaration": true
}
}
declaration
: Diz ao TypeScript para emitir.d.ts
arquivos. Isso é necessário para que as bibliotecas possam obter autocomplete nos.js
arquivos que você está criando.
Edifício para uma biblioteca em um Monorepo
Se você estiver criando uma biblioteca em um monorepo, você também vai querer essas opções.
{
"compilerOptions": {
"declaration": true,
"composite": true,
"sourceMap": true,
"declarationMap": true
}
}
composite
: Diz ao TypeScript para emitir.tsbuildinfo
arquivos. Isso diz ao TypeScript que seu projeto é parte de um monorepo e também o ajuda a armazenar em cache builds para rodar mais rápido.sourceMap
edeclarationMap
: Diz ao TypeScript para emitir mapas de origem e mapas de declaração. Eles são necessários para que, quando os consumidores de suas bibliotecas estiverem depurando, eles possam pular para o código-fonte original usando go-to-definition.
Não transpilando com TypeScript
Se você não estiver transpilando seu código com tsc
, ou seja, usando TypeScript mais como um linter, você vai querer essas opções.
{
"compilerOptions": {
"module": "preserve",
"noEmit": true
}
}
module
:preserve
é a melhor opção porque imita mais de perto como os empacotadores tratam os módulos.moduleResolution: Bundler
está implícito nesta opção.noEmit
: Diz ao TypeScript para não emitir nenhum arquivo. Isso é importante quando você está usando um bundler para não emitir.js
arquivos inúteis.
Correndo no DOM
Se o seu código for executado no DOM, você vai querer essas opções.
{
"compilerOptions": {
"lib": ["es2022", "dom", "dom.iterable"]
}
}
lib
: Informa ao TypeScript quais tipos integrados incluir.es2022
é a melhor opção para estabilidade.dom
edom.iterable
fornece tipos parawindow
,document
etc.
Não está em execução no DOM
Se o seu código não rodar no DOM, você vai querer lib: ["es2022"]
.
{
"compilerOptions": {
"lib": ["es2022"]
}
}
São os mesmos acima, mas sem as tipagens dom
e dom.iterable
.
Registro de alterações
Tenho atualizado esta folha de dicas conforme o TypeScript evolui e conforme eu refino minha visão do que pertence a um. reutilizável tsconfig.json
. Aqui está o changelog:
- 2024-04-23 : Adicionado
verbatimModuleSyntax
às opções básicas. Com a introdução demodule: Preserve
,verbatimModuleSyntax
é muito mais útil. Muitos aplicativos fazem ‘ESM falso’, onde eles escrevem importações e exportações, mas transpilam para CommonJS. Next.js é um exemplo comum. Antes demodule: Preserve
,verbatimModuleSyntax
daria erro em cada declaração de importação ou exportação porque estava esperando um módulo. Commodule: Preserve
, seu escopo é reduzido, garantindoimport/export type
que seja usado corretamente. - 2024-04-23 : Adicionado
noImplicitOverride
às opções de rigor. Nunca soube dessa opção, ou daoverride
palavra-chave, até que descobri enquanto pesquisava meu livro.noImplicitOverride
é uma melhoria muito pequena sem custo, então por que não?