TypeScript 7 ve Sonrası: Go ile Yazılan Derleyici ve Yeni Varsayılanlar
Go ile yazılan TypeScript 7 derleyicisini, 6.0 ile gelen varsayılanları, 7.0'da kaldırılan ayarları, isolatedDeclarations'ı, TC39 Type Annotations önerisini ve 7.1 betasının getirdiklerini görüyoruz.
Sürüm notu: Bu yazıdaki kodlar TypeScript 7.0 ve Node 26 içindir.
Önce Tahmin Et
Birkaç yıl önce kurulmuş bir projenin tsconfig'i. TypeScript 5 ile sorunsuz derleniyordu, biri de güncelleme öncesi "uyarıları sustursun" diye son satırı eklemiş:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"baseUrl": "./src",
"outFile": "dist/app.js",
"strict": false,
"ignoreDeprecations": "6.0"
},
"include": ["src"]
}
npm i -D typescript ile TypeScript 7'ye geçip npx tsc çalıştırınca ne olur? Proje derlenir mi, yoksa hata verirse kaç ayar için? ignoreDeprecations satırı işe yarar mı? Cevabı, 7.0'da nelerin kaldırıldığını konuşurken vereceğiz.
Project Corsa: Derleyici Go'ya Taşındı
Serinin ilk yazısında tek cümleyle geçmiştik: TypeScript 7.0, 8 Temmuz 2026'da çıktı ve derleyicisi Go diliyle baştan yazıldı. Proje içeride "Project Corsa" adıyla yürüdü. On yılı aşkın süre TypeScript'in derleyicisi TypeScript ile yazılmıştı ve JavaScript üzerinde çalışıyordu; artık npm i -D typescript sana native, Go ile derlenmiş bir tsc kuruyor. TypeScript ekibinin duyuru yazısına göre tam build'ler 8 ila 12 kat hızlı ve daha az bellek kullanıyor. Büyük bir projede bu, beklemekle beklememek arasındaki fark demek.
Geçiş döneminde bu derleyici bir önizleme paketi olarak, @typescript/native-preview adıyla ve tsgo komutuyla dağıtıldı. 7.0 RC ile birlikte komut yeniden tsc oldu, gece sürümleri typescript@next'e taşındı. Go portunun geliştirildiği microsoft/typescript-go deposu portun tamamlandığını söylüyor ve arşivleniyor; çalışmalar microsoft/TypeScript'e geri döndü.
En önemli nokta şu: 7.0 yeni bir dil özelliği getirmedi. Bu serideki her şey, generic'lerden conditional type'lara, aynı şekilde çalışıyor. Değişen, derleyicinin hızı, varsayılanlar ve birkaç küçük davranış. Örneğin template literal inference artık Unicode code point'lerini koruyor, JSDoc denetimi de yeniden düzenlendi; ikincisini bir önceki yazıda görmüştük.
6.0'ın Getirdiği Varsayılanlar
TypeScript 6.0, 23 Mart 2026'da çıkan son JavaScript tabanlı derleyici. Görevi 7'ye köprü olmaktı ve bunu varsayılanları değiştirerek yaptı. 7.0 da aynı varsayılanlarla geliyor. Bu serinin bütün örnekleri bu varsayılanlara göre yazıldı:
strict artık true; yeni bir projede strict mod için hiçbir şey yazman gerekmiyor. module esnext, target 6.0'da es2025; 7.0'da ise esnext'ten bir önceki ES sürümü. noUncheckedSideEffectImports açık, yani import "./polyfill.ts" gibi yan etki import'larında dosya bulunamazsa hata alırsın. libReplacement kapalı. rootDir artık tsconfig'in bulunduğu klasör.
En çok şaşırtan değişiklik types: varsayılan değeri artık []. Eskiden node_modules/@types altındaki her paket otomatik olarak projeye dahil olurdu; şimdi hiçbiri dahil değil. Node ile çalışan bir projede "types": ["node"] yazman gerekiyor. Eski davranışı istersen ["*"] yazabilirsin. 6.0 bunların yanında es2025 lib'ini (RegExp.escape, Iterator ve Set method'ları) ve esnext altında Temporal tiplerini de getirdi; dom lib'i artık dom.iterable'ı da içeriyor. 7.0 bunlara bir şey daha ekliyor: 6.0'da bir ayar olan stableTypeOrdering 7.0'da her zaman açık.
7.0'da Kaldırılanlar
6.0 bir dizi ayarı deprecated ilan etti ve "ignoreDeprecations": "6.0" ile bu uyarıları geçici olarak susturmana izin verdi. 7.0'da bu deprecation'ların hepsi kesin hata. Baştaki tsconfig'i TypeScript 7.0.2 ile derlediğimizde aldığımız çıktı:
tsconfig.json(3,15): error TS5108: Option 'target=ES5' has been removed. Please remove it from your configuration.
tsconfig.json(5,25): error TS5108: Option 'moduleResolution=node10' has been removed. Please remove it from your configuration.
tsconfig.json(6,5): error TS5102: Option 'baseUrl' has been removed. Please remove it from your configuration.
Use '"paths": {"*": ["./src/*"]}' instead.
tsconfig.json(7,5): 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.
Visit https://aka.ms/ts6 for migration information.
tsconfig.json(7,5): error TS5102: Option 'outFile' has been removed. Please remove it from your configuration.
Cevap bu: proje derlenmiyor ve ignoreDeprecations hiçbir şeyi değiştirmiyor; o satırla ve o satır olmadan aynı beş hatayı aldık. "6.0" değeri adı üstünde, yalnızca 6.0 için geçerli. Dikkat edersen "node" değeri mesajda node10 olarak görünüyor; ikisi aynı eski çözümleme stratejisi. rootDir hatası da yeni varsayılanın bir sonucu: tsc artık çıktı klasörünün yapısını tahmin etmiyor, açıkça söylemeni istiyor.
Kaldırılan listenin geri kalanı da bilinmeye değer: --downlevelIteration; moduleResolution'da classic; module'de amd, umd, systemjs ve none; esModuleInterop ya da allowSyntheticDefaultImports'u false yapmak; alwaysStrict: false; namespace yerine module Foo {} yazımı; import'larda with yerine asserts. Bir tsconfig varken komut satırında dosya vermenin TS5112 verdiğini ve --ignoreConfig gerektirdiğini de Temel seride görmüştük. Aynı projenin TypeScript 7 ile temiz derlenen hâli:
{
"compilerOptions": {
"target": "es2025",
"module": "nodenext",
"rootDir": "./src",
"outDir": "./dist",
"paths": { "*": ["./src/*"] }
},
"include": ["src"]
}
strict: false satırını da sildik; varsayılan artık açık ve eski bir projede bu, kendi başına bir iş. Bir önceki yazıdaki kademeli strict yolu tam da bunun için.
7.0'ın Henüz Yapamadıkları
7.0 kararlı bir sürüm, önizleme değil. Ama iki eksiği var. Birincisi, programatik bir API yok: derleyiciyi bir Node script'inden kütüphane olarak çağıran araçlar 7.0 ile çalışmıyor; bu API 7.1 ile geliyor. İkincisi, dil servisi eklentileri yok: farklı dosya türlerindeki template'lerin içini denetleyen editör eklentileri 7.0'da çalışmıyor. Bunlara ihtiyacın varsa ya 6.0'da kalırsın ya da uyumluluk paketi @typescript/typescript6'yı kurup onun tsc6 komutunu kullanırsın. Editör tarafında VS Code için bir TypeScript 7 eklentisi var; VS Code'a yerleşik desteğin geleceği de duyuruldu.
Bir de Playground meselesi. TypeScript Playground hâlâ JavaScript tabanlı derleyiciyi çalıştırıyor; sürüm listesi 6.0.3'te bitiyor. Varsayılan ayarlar iki tarafta aynı, ama bazı uç durumlarda sonuç farklı olabilir. Bunu kendimiz denedik:
type FirstChar<S extends string> = S extends `${infer C}${string}` ? C : never;
type Rocket = FirstChar<"🚀 launch">;
const ok: Rocket = "🚀";
TypeScript 7.0.2'de Rocket "🚀" oluyor ve kod derleniyor. Aynı dosyayı TypeScript 6.0.3 ile denetlediğimizde Rocket emojinin sadece ilk yarısını, tek başına anlamsız bir UTF-16 parçasını tutuyor ve ok satırı TS2322 veriyor. Template literal inference'ın Unicode code point'lerini koruması tam olarak bu. isolatedDeclarations hatalarının metinleri de iki derleyicide farklı çıktı. Playground'da gördüğün sonuç yerel tsc'den farklıysa önce sürüme bak.
isolatedDeclarations: Her Dosya Kendi .d.ts'ini Üretsin
Hız sadece derleyiciden gelmiyor, araçların birbirini beklememesinden de geliyor. TS 5.5 ile gelen isolatedDeclarations bu fikrin ürünü. Normalde bir dosyanın .d.ts'ini üretmek için tip denetleyicisi gerekir; export edilen bir fonksiyonun dönüş tipi başka dosyalardaki type'lara bağlı olabilir. Bu ayar açıkken TypeScript, export'larının type'ı tip denetleyicisi olmadan okunamayan her yeri hata olarak işaretler:
export function add(a: number, b: number) {
return a + b;
}
export const defaultTimeout = 5000;
export const config = {
retries: add(1, 2),
};
function internalHelper(value: string) {
return value.trim();
}
--isolatedDeclarations --declaration ile denetlediğimizde iki hata çıkıyor, ikisi de TS9013, "Expression type can't be inferred with --isolatedDeclarations.": biri add'in dönüş ifadesinde, biri retries'ta. defaultTimeout sorun değil, çünkü bir literal'in type'ı tek başına okunabiliyor. Export edilmeyen internalHelper da sorun değil, çünkü public API'nin parçası değil. add'e : number dönüş tipi ve config'e bir annotation eklediğinde dosya temiz derleniyor. Ayar tek başına kullanılamıyor; declaration ya da composite olmadan TS5069 alıyorsun.
Karşılığında ne kazanıyorsun? Bundler'lar ve diğer araçlar her dosyanın .d.ts'ini birbirinden bağımsız ve paralel olarak üretebiliyor; monorepo'da bir paket, bağımlı olduğu paketin denetimi bitmeden kendi işine başlayabiliyor. Bedeli de belli: export'larda daha fazla annotation yazıyorsun. Bu yüzden TypeScript ekibi bu ayarı her projede değil, ihtiyaç duyan projelerde açmayı öneriyor.
Type Annotations Önerisi: Tarayıcıya Tip Gelecek mi?
Serinin başında tarayıcıların TypeScript çalıştırmadığını söylemiştik. TC39'da bunu değiştirmeyi hedefleyen bir öneri var: Type Annotations. Fikir, JavaScript motorlarının tip annotation'larını yorum gibi görüp atlaması; yani tipler kontrol edilmeyecek, sadece kodun çalışmasını engellemeyecek. Öneri hâlâ Stage 1'de ve deposundaki README önerinin "has not been updated regularly" olduğunu, yani düzenli güncellenmediğini açıkça yazıyor. Yakın zamanda tarayıcıda görmeyi bekleme.
Bu fikrin pratik bir karşılığını zaten kullanıyoruz: Node'un type stripping'i. Node 26 tipleri siler ve kodu çalıştırır; tip denetimi yapmaz. Bu serideki örnekleri erasable yazmamızın, decorator ve enum'u ayrı tutmamızın sebebi buydu. Type Annotations bir gün ilerlerse büyük ihtimalle aynı sınır geçerli olacak: tipler silinebilir olmalı.
7.1 Beta ve Sonrası
TypeScript 7.1'in betası 20 Ekim 2026'da çıktı; RC'nin betadan yaklaşık bir ay sonra gelmesi bekleniyor. Denemek için npm i -D typescript@beta yeterli; npm'de latest etiketi 7.0.2'yi, beta etiketi 7.1.0-beta'yı, next de gece sürümlerini gösteriyor. Kurulu sürümü her zaman şöyle kontrol edebilirsin:
npx tsc -v
Bizim ortamımızda bu komut Version 7.0.2 yazıyor. 7.1'in getirdikleri arasında şunlar var: ambient module'lerde import attributes (with { type: "css" }, ayrıca "text" ve "bytes"), import source ile source phase import'ları, es2026 target ve lib'i (Math.sumPrecise, Array.fromAsync), typescript/sync, /fs ve /ast altında yeni compiler API'si, farklı dosya türlerini TypeScript'e tanıtan content mapper'lar ve daha sıkı distributive conditional type kuralları. Sonuncusu conditional type yazısında gördüğümüz distributive davranışı doğrudan ilgilendiriyor; 7.1 kararlı sürüm olarak çıktığında ayrıca bakmaya değer.
Sık Düşülen Tuzaklar
Birincisi, ignoreDeprecations'a güvenmek. 6.0'da işe yarayan bu kaçış yolu 7.0'da yok; deprecated ayarları gerçekten temizlemen gerekiyor.
İkincisi, types: [] varsayılanını unutmak. Node projesinde process ya da Buffer birden "bulunamıyor" hatası veriyorsa, büyük ihtimalle @types/node kurulu ama tsconfig'de "types": ["node"] yok.
Üçüncüsü, Playground ile yerel tsc'nin her zaman aynı sonucu verdiğini varsaymak. Biri 6.0.3, diğeri 7.0; uç durumlarda farklılar.
Dördüncüsü, derleyici eklentilerine ya da programatik API'ye dayanan bir araç zincirini 7.0'a körlemesine taşımak. Önce araçlarının 7.0'ı desteklediğinden emin ol; desteklemiyorsa tsc6 ile bir süre iki derleyiciyi yan yana kullan.
Küçük Bir Deneme
★☆☆ Derlenir mi, tahmin et: yeni bir klasörde npm i -D typescript kur ve npx tsc --init'in ürettiği tsconfig'te target değerini "es5" yap. tsc ne der ve hangi hata kodunu verir?
★★☆ Kendi projelerinden birinin tsconfig'ini TypeScript 7.0 ile derle. Çıkan her TS5102 ve TS5108 hatası için bu yazıdaki listeden karşılığını bul ve ayarı modern hâline çevir.
★★★ isolatedDeclarations örneğini --isolatedDeclarations --declaration ile denetle, hataları annotation ekleyerek düzelt. Sonra --noEmit'i kaldırıp --outDir dist ile derle ve üretilen .d.ts dosyasını, yazdığın annotation'larla karşılaştır.
TypeScript Temel, Orta ve İleri serileri burada bir araya geliyor, ama TypeScript durmuyor. 7.1 kararlı sürüm olarak çıktığında, sonra 7.2 ve sonrası geldikçe, yeni özellikleri aynı şekilde yazı yazı ekleyeceğiz: önce tahmin, sonra kod, sonra derleyicinin ne dediği. Seri yeni TypeScript sürümleriyle büyümeye devam edecek.