tsconfig.json, bir TypeScript projesinin yapılandırma dosyasıdır. tsc komutunu argümansız çalıştırdığınızda derleyici onu mevcut klasörde (sonra üst klasörlerde) arar, compilerOptions içindeki seçenekleri okur ve include ile listelenen dosyaları kontrol eder. Küçük ama eksiksiz bir örnek:
{
"compilerOptions": {
"target": "es2022",
"module": "nodenext",
"strict": true,
"rootDir": "./src",
"outDir": "./dist"
},
"include": ["src"]
}
Bu yapılandırma src içindeki her TypeScript dosyasını, Node.js'in modül kurallarıyla ve tüm strict kontroller açıkken, ES2022 kodu olarak dist içindeki JavaScript'e derler. npx tsc --init her seçeneğe yorum eklenmiş daha uzun bir başlangıç dosyası oluşturur.
Dosya yorumlu JSON'dur: // yorumları, /* */ yorumları ve sondaki virgüllerin hepsi kabul edilir.
Önerilen Başlangıç Yapılandırması
Bir Node.js uygulaması veya betiği için:
{
"compilerOptions": {
"rootDir": "./src",
"outDir": "./dist",
"target": "es2024",
"lib": ["es2024"],
"module": "nodenext",
"types": ["node"],
"strict": true,
"noUncheckedIndexedAccess": true,
"verbatimModuleSyntax": true,
"skipLibCheck": true,
"sourceMap": true
},
"include": ["src"]
}
Node.js tipleri için npm install --save-dev @types/node gerekir. module: "nodenext" ile package.json içindeki "type" alanı, bir .ts dosyasının ES modülü mü ("type": "module") yoksa CommonJS mi (npm init -y komutunun yazdığı "type": "commonjs") olduğunu belirler. import ve export kullanan yeni projeler için "type": "module" kullanın.
Vite, esbuild veya webpack gibi bir bundler'ın derlediği kodda JavaScript'i bundler yazar, tsc yalnızca kontrol eder:
{
"compilerOptions": {
"target": "es2022",
"lib": ["es2022", "dom"],
"module": "preserve",
"noEmit": true,
"strict": true,
"noUncheckedIndexedAccess": true,
"verbatimModuleSyntax": true,
"isolatedModules": true,
"skipLibCheck": true,
"jsx": "react-jsx"
},
"include": ["src"]
}
Framework başlangıç şablonları (Vite, Next.js, Angular) kendi tsconfig.json dosyalarını oluşturur. Onu değiştirmek yerine onunkinden başlayın.
Önemli Seçenekler
| Seçenek | Ne yapar | TypeScript 7 varsayılanı |
|---|---|---|
target | Çıktının JavaScript sürümü; daha yeni sözdizimi eski hedefler için yeniden yazılır | es2025 |
lib | Denetleyicinin bildiği yerleşik API tipleri (Array.prototype.at, Map, document) | target ile eşleşir, artı DOM |
module | Üretilen modül kodunun türü ve uygulanan modül kuralları | esnext |
moduleResolution | Import yollarının diskte nasıl bulunacağı | Eşleşen module ile nodenext veya node16, aksi halde bundler |
strict | Tüm strict kontrol ailesini açar | true |
rootDir | Yapısı outDir içine yansıtılan klasör | tsconfig.json dosyasını içeren klasör |
outDir | .js (ve .d.ts) dosyalarının gideceği yer | Her kaynak dosyanın yanı |
include / exclude / files | Hangi dosyaların projeye dahil olduğu | Klasör altındaki her .ts dosyası |
types | Hangi @types paketlerinin import olmadan yüklendiği | [], hiçbiri |
noEmit | Yalnızca kontrol et, hiçbir şey yazma | false |
declaration | .d.ts tip bildirim dosyalarını da yaz | false |
sourceMap | Debugger'lar için .js.map dosyaları yaz | false |
esModuleInterop | import x from "cjs-package" ifadesinin CommonJS paketleriyle çalışmasını sağlar | true (kapatılamaz) |
skipLibCheck | node_modules içindekiler dahil .d.ts dosyalarının tip kontrolünü atla | false |
target ve lib
target, çıktının hangi JavaScript sürümünde çalışması gerektiğini söyler. Hedeften daha yeni sözdizimi yeniden yazılır: "target": "es2017" ile bir sınıf alanı veya ??= daha eski koda dönüştürülür. TypeScript 7'nin kabul ettiği en düşük hedef es2015 (es6) sürümüdür; es5 kaldırıldı.
target eksik çalışma zamanı API'lerini eklemez. Onları tanımlamak lib seçeneğinin, sağlamak ise bir polyfill'in işidir. lib, denetleyiciye hangi yerleşik nesnelerin ve metotların var olduğunu söyler. Varsayılanı target değerini izler ve tarayıcı DOM tiplerini de içerir; bu yüzden lib değerini kendiniz ayarlamadıkça bir Node.js projesinde bile document tip kontrolünden geçer. lib değerinizden daha yeni bir standarttaki bir metodu kullanmak derleme hatasıdır:
src/b.ts(1,24): error TS2550: Property 'toSorted' does not exist on type 'number[]'. Do you need to change your target library? Try changing the 'lib' compiler option to 'es2023' or later.
Bu dokümanlardaki çalıştırılabilir örnekler es2022 lib'ini kullanır; bu yüzden toSorted, Object.groupBy ve yeni Set metotları onlarda kullanılamaz.
module ve moduleResolution
Yeni kod için module seçeneğinin üç mantıklı değeri vardır:
nodenext: Node.js'in çalıştırdığı kod için. Her dosya, tıpkı Node'un karar verdiği gibi, uzantısına (.mts,.cts) veya en yakınpackage.jsondosyasındaki"type"alanına göre ESM ya da CommonJS'tir. ES modüllerindeki göreli import'lar bir dosya uzantısı ister ve kaynak.tsolsa bile.jsolarak yazılır:import { add } from "./math.js".moduleResolutionotomatik olarak ona uyar.preserve: bir bundler'ın işlediği kod için. Import'lar yazıldığı gibi bırakılır ve çözümleme, uzantısız import'lara izin verenbundlerkurallarını kullanır.esnext:bundlerçözümlemesiyle düz ES modülü çıktısı.moduleayarlanmadığında varsayılan budur.
tsc --init yapılandırmasıyla alınan yaygın bir ilk hata, npm init -y komutunun "type": "commonjs" yazmasından kaynaklanır:
src/main.ts(1,10): error TS1295: ECMAScript imports and exports cannot be written in a CommonJS file under 'verbatimModuleSyntax'.
Dosya import kullanıyor ama package.json projenin CommonJS olduğunu söylüyor. "type" değerini "module" yapın. Import ve export'ları modüller sayfası ayrıntılı anlatıyor.
strict ve Kontrol Seçenekleri
"strict": true bir grup kontrolü birden açar: noImplicitAny, strictNullChecks, strictFunctionTypes, strictBindCallApply, strictPropertyInitialization, strictBuiltinIteratorReturn, noImplicitThis ve useUnknownInCatchVariables. TypeScript 7'de varsayılandır ve buradaki her çalıştırılabilir örnekte açıktır. Strict mod için yazılmış kod, eksik olabilecek bir değeri kullanmadan önce daraltır:
Notasyon olmadan bir parametrenin tipi çıkarılamaz ve noImplicitAny bunu bildirir:
index.ts(2,17): error TS7006: Parameter 'n' implicitly has an 'any' type.
strict her yararlı kontrolü içermez. Eklemeye değer iki tanesi noUncheckedIndexedAccess (bir dizi elemanı veya index signature araması T | undefined tipindedir) ve exactOptionalPropertyTypes (opsiyonel bir özellik açıkça undefined olarak atanamaz) seçenekleridir; tsc --init ikisini de açar. noUnusedLocals, noImplicitReturns ve noFallthroughCasesInSwitch gibi stil kontrolleri varsayılan olarak kapalıdır.
Hangi Dosyalar: include, exclude, rootDir, outDir
include veya files yoksa proje, klasördeki ve alt klasörlerindeki her .ts, .tsx ve .d.ts dosyasını içerir. node_modules her zaman dışarıda bırakılır. outDir de dışarıda bırakılır, ama yalnızca exclude ayarlamadığınız sürece: özel bir exclude listesi bu varsayılanın yerini alır, bu yüzden çıktı klasörünü ona ekleyin. include ve exclude glob kalıpları alır:
{
"include": ["src", "scripts/**/*.ts"],
"exclude": ["src/**/*.test.ts"]
}
exclude yalnızca include seçeneğinin bulduklarını filtreler. Dahil edilen başka bir dosyanın import ettiği bir dosya yine derlenir.
outDir çıktının gideceği yerdir, rootDir ise kaynak ağacının oraya yansıtılan kısmıdır: "rootDir": "./src" ile src/api/users.ts dosyası dist/api/users.js olur. İkisini de ayarlayın. rootDir varsayılan olarak tsconfig.json dosyasını içeren klasördür; bu yüzden kaynaklar src içindeyken yalnızca outDir ayarlarsanız TypeScript 7 şu hatayla durur:
error TS5011: The common source directory of 'tsconfig.json' is './src'. The 'rootDir' setting must be explicitly set to this or another path to adjust your output's file layout.
Çıktı Seçenekleri: noEmit, declaration, sourceMap
"noEmit": true,tsckomutunu saf bir tip denetleyicisine dönüştürür. JavaScript'i başka bir araç (bir bundler,tsx, Node.js type stripping) ürettiğinde kullanın."declaration": trueher modül için bir.d.tsdosyası, yani kodsuz tipleri yazar. Kullanıcılarının tip alabilmesi için kütüphanelerin buna ihtiyacı vardır.declarationMap,.tskaynağına "go to definition" için map dosyaları ekler."sourceMap": true, debugger'ların ve stack trace'lerin.tssatırlarını göstermesi için.js.mapdosyaları yazar."noEmitOnError": true, tip hataları varken hiçbir şey yazmaz. Bu seçenek olmadantschataları bildirir ve yine de JavaScript'i yazar.
types, esModuleInterop ve skipLibCheck
types, import olmadan global olarak yüklenen @types paketlerini listeler. TypeScript 7'nin varsayılanı boş bir listedir; bu yüzden npm install --save-dev @types/node sonrasında "types": ["node"] de eklersiniz, aksi halde process ve require bilinmez kalır (error TS2591: Cannot find name 'process'). Jest'in describe fonksiyonu gibi global fonksiyonlara sahip test çalıştırıcıları da aynı listeye girer.
esModuleInterop, CommonJS paketlerinin default import'larının çalışmasını sağlar (import express from "express"). TypeScript 7'de her zaman açıktır ve false yapmak hatadır.
skipLibCheck, bildirim dosyalarının tip kontrolünü atlar. Derlemeleri hızlandırır ve node_modules içindeki, düzeltemeyeceğiniz hataları önler; bedeli, iki kütüphanenin tipleri arasındaki çakışmaları fark etmemektir. Çoğu proje bunu açar.
extends ile Ayarları Paylaşmak
extends başka bir yapılandırmayı yükler ve bu dosyanın onun bazı kısımlarını geçersiz kılmasına izin verir:
{
"extends": "./tsconfig.base.json",
"compilerOptions": {
"rootDir": "./src",
"outDir": "./dist"
},
"include": ["src"]
}
compilerOptions seçenek seçenek birleştirilir; include, exclude ve files ise bu dosya onları ayarlarsa temel dosyadakilerin yerini alır, birleştirilmez. Temel dosyadaki yollar temel dosyaya göre çözümlenir. extends bir paket de kabul eder: @tsconfig/bases projesi her ortam için bir tane yayınlar; örneğin npm install --save-dev @tsconfig/node24 ve ardından "extends": "@tsconfig/node24/tsconfig.json".
Tüm extends ve varsayılanlar uygulandıktan sonraki son ayarları görmek için şunu çalıştırın:
npx tsc --showConfig
TypeScript 7'de Kaldırılan Seçenekler
TypeScript 6 bu ayarları kullanımdan kaldırdı (deprecated), TypeScript 7 ise tamamen sildi. Hâlâ bunlardan birini kullanan bir yapılandırma error TS5108 veya TS5102 ile başarısız olur; örneğin Option 'baseUrl' has been removed. Please remove it from your configuration.
| Kaldırılan ayar | Bunun yerine |
|---|---|
"target": "es5" | es2015 veya sonrası |
"moduleResolution": "node" (node10) veya "classic" | nodenext veya bundler |
"module": "amd", "umd", "system", "none" | nodenext, esnext veya preserve, diğer formatlar için bir bundler |
baseUrl | tsconfig dosyasına göreli paths girdileri |
outFile | Bir bundler |
downlevelIteration | Hiçbir şey: es2015 ve üstü hedefler iterasyonu yerel olarak destekler |
"esModuleInterop": false, "allowSyntheticDefaultImports": false, "alwaysStrict": false | Satırı silin; bunlar her zaman açıktır |
Bu sürümdeki diğer değişiklikleri, bu tablonun kapsamadığı yeni varsayılanlar dahil, TypeScript 7 sayfası listeliyor.
Sıkça Sorulan Sorular
tsconfig.json nedir?
Bir TypeScript projesinin yapılandırma dosyasıdır. Varlığı klasörü proje kökü olarak işaretler, compilerOptions derleyicinin kodu nasıl kontrol edip üreteceğini belirler, include, exclude veya files ise hangi dosyaların projeye ait olduğunu söyler. Argümansız çalıştırılan tsc bu dosyayı okur.
tsconfig.json dosyası nasıl oluşturulur?
TypeScript kuruluyken proje klasöründe npx tsc --init çalıştırın. Önerilen ayarlarla ve her seçenekte bir yorumla bir tsconfig.json yazar. Dosyayı elle de yazabilirsiniz; {} her varsayılanı kullanan geçerli bir tsconfig'dir.
tsconfig'de target neye ayarlanmalı?
Kodunuzun çalışması gereken en eski JavaScript sürümüne. Güncel Node.js için es2022 veya sonrası güvenlidir; TypeScript 7'nin varsayılanı es2025'tir. target, hangi yeni sözdiziminin eski motorlar için yeniden yazılacağını belirler ve ayrıca varsayılan lib değerini, yani denetleyicinin bildiği yerleşik API kümesini seçer.
module ile moduleResolution arasındaki fark nedir?
module, derleyicinin yazdığı modül kodunun türünü (ES import/export veya CommonJS require) ve hangi modül kurallarının geçerli olduğunu belirler. moduleResolution ise "./utils.js" veya "lodash" gibi bir import yolunun diskte nasıl bulunacağını belirler. Node.js'in çalıştırdığı kod için nodenext, bir bundler'ın işlediği kod için module: "preserve" (bu bundler çözümlemesini de getirir) kullanın.
tsconfig.json içinde yorum olabilir mi?
Evet. Derleyici onu yorumlu JSON olarak okur: // ve /* */ yorumlarına ve sondaki virgüllere izin verilir; tsc --init bu yüzden yorum satırına alınmış seçeneklerle dolu bir dosya yazar. Onu katı JSON olarak ayrıştıran diğer araçlar bunlarda hata verebilir.