- JavaScript tabanlı mevcut kod tabanının son sürümü ve Go ile yazılmış yerel port olan TypeScript 7.0’a geçişi hazırlayan bir köprü sürüm
this kullanmayan fonksiyonlarda bağlam duyarlılığının gevşetilmesi, #/ ile başlayan subpath imports desteği gibi tür çıkarımı ve modül çözümleme iyileştirmeleri içeriyor
strict varsayılanının true olması, target varsayılanının es2025, types varsayılanının [] olması gibi derleyici seçeneklerinin varsayılanlarında kapsamlı modernizasyon
- ES5 hedefi, AMD/UMD/SystemJS modülleri,
--baseUrl, --moduleResolution node10 gibi çok sayıda eski seçeneğin kullanımdan kaldırılması (deprecation)
- Temporal API, Map’in
getOrInsert/getOrInsertComputed, RegExp.escape gibi en yeni ECMAScript Stage 4 önerileri için tür desteği eklendi
TypeScript 6.0’ın konumu
- Mevcut JavaScript kod tabanı temelli son sürüm; TypeScript 7.0’a (Go yerel portu) geçiş için bir köprü görevi görüyor
- TypeScript 7.0, yerel kod ve paylaşımlı bellekli çok iş parçacıklılıktan yararlanıyor ve halihazırda tamamlanmaya çok yakın
- 6.0’daki değişikliklerin çoğu, 7.0 benimsenmesini uyumlu hale getirmek ve hazırlamak için yapıldı
- TypeScript 7.0, VS Code eklentisi veya npm paketi ile önceden denenebiliyor
Beta ve RC sonrası değişiklikler
- Generic çağrılarda, özellikle generic JSX ifadelerinde fonksiyon ifadelerinin tür denetimi ayarlandı — mevcut kodda daha fazla hatayı yakalıyor, ancak bazı generic çağrılarda açık tür argümanları gerekebilir
import() çağrılarında da import assertion sözdiziminin (assert) kullanımdan kaldırılması genişletildi
- DOM türleri güncellendi — en yeni web standartları yansıtıldı, Temporal API ile ilgili ayarlamalar da dahil
this kullanmayan fonksiyonlarda bağlam duyarlılığının gevşetilmesi
- TypeScript, tür çıkarımı sırasında açık türü olmayan parametrelere sahip fonksiyonları bağlamsal olarak duyarlı fonksiyonlar (contextually sensitive function) olarak sınıflandırır ve çıkarım sıralamasında daha sonraya bırakır
- Method syntax ile yazılan fonksiyonlarda örtük bir
this parametresi bulunduğundan, ok fonksiyonlarından farklı olarak her zaman bağlam duyarlı sayılıyordu
- Bu nedenle nesne literal’i içindeki method sırasına göre tür çıkarımının başarısız olduğu durumlar oluşabiliyordu
- TypeScript 6.0’da
this gerçekten kullanılmayan fonksiyonlar artık bağlam duyarlı kabul edilmiyor
- Bu fonksiyonlar tür çıkarımında daha yüksek öncelik alıyor ve böylece method sırasından bağımsız olarak doğru çıkarım yapılıyor
- Mateusz Burzyński’nin katkısıyla hayata geçirildi
#/ ile başlayan Subpath Imports desteği
- Node.js’in subpath imports özelliği, paket içi modüller için takma adları
package.json içindeki imports alanıyla tanımlamaya yarıyor
- Önceden
# sonrasında mutlaka bir karakter gerektiği için #/ ile başlayan yollar kullanılamıyordu
- Bu da paketleyicilerde
@/ öneki geleneğine alışkın geliştiriciler için kafa karışıklığı yaratıyordu
- Node.js kısa süre önce
#/ ile başlayan subpath import’ları desteklemeye başladı
"#/*": "./dist/*" biçiminde daha sade eşlemeler mümkün
- TypeScript 6.0 bunu
--moduleResolution nodenext ve bundler seçeneklerinde destekliyor
- magic-akari’nin katkısıyla hayata geçirildi
--moduleResolution bundler ile --module commonjs kombinasyonuna izin verilmesi
- Önceden
--moduleResolution bundler yalnızca --module esnext veya --module preserve ile kullanılabiliyordu
--moduleResolution node(node10) kullanımdan kaldırıldığı için, bu yeni kombinasyon birçok proje için en uygun yükseltme yolu
- Uzun vadede ise
--module preserve + --moduleResolution bundler ya da --module nodenext yönüne geçiş öneriliyor
--stableTypeOrdering bayrağı
- TypeScript içinde türlere atanan type ID’ler işleme sırasına göre belirlenir ve union türleri bunlara göre sıralanır
- Bildirim sırasına bağlı olarak declaration emit çıktısının değişmesine yol açan öngörülemez durumlar oluşabilir
- TypeScript 7.0, paralel tür denetimi getirdiğinden, deterministik olmayan ID atama sorununu çözmek için içerik tabanlı deterministik bir sıralama algoritması kullanıyor
- Örneğin
100 | 500 her zaman aynı sırayla yazdırılır
- 6.0’da
--stableTypeOrdering bayrağı etkinleştirilirse davranış 7.0’daki tür sıralamasıyla eşleşir ve iki kod tabanı arasındaki fark azalır
- Tür denetiminde %25’e kadar performans kaybı olabilir
- Çıkarım farklılıklarından kaynaklanan tür hataları, açık tür argümanları veya değişken anotasyonları eklenerek çözülebilir
- Bu bayrak yalnızca 6.0’dan 7.0’a geçişte tanılama amaçlı düşünülmüş; uzun süreli kullanımı önerilmiyor
es2025 seçeneği (target ve lib)
- ES2025 yeni JavaScript dil özellikleri getirmiyor, ancak yerleşik API türleri (ör.
RegExp.escape) ekliyor
- Daha önce
esnext içinde yer alan Promise.try, Iterator method’ları ve Set method’ları es2025 içine taşındı
- Kenta Moriuchi’nin katkısıyla hayata geçirildi
Temporal API tür desteği
- Stage 4’e ulaşan Temporal önerisinin yerleşik türleri TypeScript 6.0’a dahil edildi
--target esnext veya "lib": ["esnext"] (ya da daha ayrıntılı esnext.temporal) ile kullanılabiliyor
Temporal.Now.instant().subtract(), .add() gibi API’ler tür güvenli biçimde kullanılabiliyor
- Birden fazla çalışma zamanında zaten mevcut ve Stage 4 ile birlikte resmî JavaScript dilinin bir parçası haline geldi
- Renegade334’ün katkısıyla hayata geçirildi
Map’in "upsert" method’ları için tür desteği (getOrInsert / getOrInsertComputed)
- Map’te anahtarın varlığını kontrol edip yoksa varsayılan değer atayan tekrar eden kalıbı sadeleştiriyor
- ECMAScript’in "upsert" önerisi Stage 4’e ulaştı ve
Map ile WeakMap için iki yeni method ekledi
getOrInsert: Anahtar yoksa belirtilen varsayılan değeri ekler ve döndürür
getOrInsertComputed: Varsayılan değerin oluşturma maliyeti yüksekse geri çağrıyla tembel hesaplama yapar
- Geri çağrı, anahtarı argüman olarak alır; böylece anahtara göre varsayılan değer üretmek için de kullanılabilir
esnext lib’e eklendiği için TypeScript 6.0’da hemen kullanılabiliyor
- Renegade334’ün katkısıyla hayata geçirildi
RegExp.escape
- RegExp içindeki özel karakterleri kaçışlayan
RegExp.escape fonksiyonu Stage 4’e ulaştı
es2025 lib’ine dahil edildiği için TypeScript 6.0’da kullanılabiliyor
- Kenta Moriuchi’nin katkısıyla hayata geçirildi
dom lib’ine dom.iterable ve dom.asynciterable entegrasyonu
- Önceden
NodeList, HTMLCollection gibi yapılarda yineleme kullanmak için "lib": ["dom", "dom.iterable"] belirtmek gerekiyordu
- TypeScript 6.0’da
lib.dom.iterable.d.ts ve lib.dom.asynciterable.d.ts içerikleri tamamen lib.dom.d.ts içine entegre edildi
dom.iterable ve dom.asynciterable hâlâ referans verilebilir, ancak artık boş dosyalar
- Tüm büyük modern tarayıcılar bu özellikleri desteklediğinden, sık yaşanan bir kafa karışıklığını gideren kullanışlı bir iyileştirme
Başlıca varsayılan değişiklikler
strict varsayılanı true: Yeni projelerin çoğu strict mod ister; daha önce false varsayımına dayanan projelerin açıkça "strict": false ayarlaması yapması gerekir
module varsayılanı esnext: ESM’in baskın modül formatı haline gelmesini yansıtıyor
target varsayılanı en güncel ES sürümü (şu anda es2025): Evergreen çalışma zamanlarının yaygınlaşması sayesinde eski sürümlere transpile etmek çoğunlukla gereksiz
noUncheckedSideEffectImports varsayılanı true: Yalnızca side effect için yapılan import’lardaki yazım hatalarını yakalamaya yardımcı olur
libReplacement varsayılanı false: Gereksiz modül çözümleme hatalarını ve izlenen hedef sayısını azaltarak varsayılan performansı iyileştirir
rootDir varsayılanının . olarak değişmesi
- Önceden belirtilmediğinde tüm declaration dışı girdi dosyalarının ortak dizini çıkarılarak belirleniyordu
- Bu da bir dosyanın projeye ait olup olmadığını anlamak için ilgili projenin yüklenip ayrıştırılmasını gerektiriyordu
- TypeScript 6.0’da varsayılan artık
tsconfig.json dosyasının bulunduğu dizin olarak sabitlendi
- Kaynak dosyalar
tsconfig.json’dan daha derin bir konumdaysa "rootDir": "./src" gibi açık ayar yapmak gerekiyor
- Aksi halde
./dist/src/index.js gibi istenmeyen çıktı yapıları oluşabilir
types varsayılanının [] olarak değişmesi
- Önceden
node_modules/@types içindeki tüm paketler otomatik dahil edildiği için derleme süresinde ciddi ek yük oluşuyordu
- Tipik depolarda yüzlerce
@types paketi dolaylı olarak dahil olabiliyordu
- TypeScript 6.0’da varsayılan
[] (boş dizi) oldu; böylece gereksiz declaration dosyalarının yüklenmesi önleniyor
- Gerçek dünyada derleme süresinde %20–50 iyileşme örnekleri görüldü
- Çoğu projede
"types": ["node"] veya "types": ["node", "jest"] gibi açık ayarlar gerekecek
"types": ["*"] ile önceki davranış geri getirilebilir
Kullanımdan kaldırılanlar (Deprecation)
target: es5 kullanımdan kaldırıldı
- ES5 hedefinin, IE’nin emekliye ayrılması ve evergreen tarayıcıların yaygınlaşmasıyla artık neredeyse hiçbir kullanım alanı kalmadı
- Asgari hedef ES2015 oldu; ES5 çıktısı gerekiyorsa harici bir derleyici kullanılması öneriliyor
--downlevelIteration kullanımdan kaldırıldı
- Yalnızca ES5 emit üzerinde etkiliydi; bu yüzden ES5 hedefinin kaldırılmasıyla amacı da ortadan kalktı
--moduleResolution node(node10) kullanımdan kaldırıldı
- Node.js 10’un modül çözümleme algoritmasını yansıtıyordu ve güncel Node.js davranışıyla artık uyuşmuyor
nodenext (doğrudan Node.js hedefleme) veya bundler (paketleyici/Bun kullanımı) yönüne geçiş öneriliyor
AMD, UMD, SystemJS modül değerleri kullanımdan kaldırıldı
--module amd, --module umd, --module systemjs, --module none artık desteklenmiyor
- ESM hem tarayıcıda hem Node.js’te yaygın olarak desteklendiği için paketleyici ya da ESM hedefine geçmek gerekiyor
--baseUrl kullanımdan kaldırıldı
- Çoğunlukla
paths için önek olarak kullanılıyordu, ancak modül çözümlemede arama kökü olarak da davrandığı için istenmeyen yol çözümleme sorunları yaratabiliyordu
- Geçiş için
baseUrl kaldırılıp önek doğrudan paths girdilerine eklenmeli
- Örnek:
"@app/*": ["app/*"] → "@app/*": ["./src/app/*"]
--moduleResolution classic kullanımdan kaldırıldı
- TypeScript’in özgün modül çözümleme algoritmasıydı; bugün tüm pratik kullanım senaryoları
nodenext veya bundler ile karşılanabiliyor
esModuleInterop false ve allowSyntheticDefaultImports false kullanımdan kaldırıldı
- Bu iki seçeneğin
false olması artık mümkün değil; böylece güvenli birlikte çalışabilirlik davranışı her zaman etkin olacak
import * as express from "express" → import express from "express" şeklinde uyarlama gerekebilir
--alwaysStrict false kullanımdan kaldırıldı
- Tüm kod artık JavaScript strict mode altında kabul ediliyor;
await, static, private gibi sözcükleri sıradan tanımlayıcı olarak kullanan kodlarda isim değişikliği gerekebilir
outFile kullanımdan kaldırıldı
- Birden fazla girdi dosyasını tek dosyada birleştirme işleviydi; artık Webpack, Rollup, esbuild, Vite gibi harici paketleyicilerle yer değiştiriyor
- Bu karar, TypeScript’in çekirdek rolü olan tür denetimi ve declaration emit’e odaklanmak için alındı
Eski module sözdizimi (namespace bildirimi) kullanımdan kaldırıldı
module Foo { ... } sözdizimi kesin olarak kaldırıldı; yerine namespace Foo { ... } kullanılmalı
declare module "some-module" { ... } biçimindeki ambient module bildirimleri ise desteklenmeye devam ediyor
- Amaç, ECMAScript’in
module block önerisiyle çakışmayı önlemek
Import asserts anahtar sözcüğü kullanımdan kaldırıldı
import ... asserts { type: "json" } → import ... with { type: "json" } olarak değiştirilmeli
- Bunun nedeni, import assertions önerisinin import attributes önerisine (
with anahtar sözcüğü) dönüşmesi
no-default-lib yönergesi kullanımdan kaldırıldı
/// <reference no-default-lib="true"/> artık desteklenmiyor; onun yerine --noLib veya --libReplacement öneriliyor
tsconfig.json varsa komut satırında dosya belirtme hatası
tsc foo.ts çalıştırıldığında aynı dizinde tsconfig.json varsa hata oluşacak
- Bunu açıkça yok saymak için
--ignoreConfig bayrağı kullanılabilir
TypeScript 7.0’a hazırlık
- 6.0’da kullanımdan kaldırılan seçenekler
"ignoreDeprecations": "6.0" ayarıyla hatasız kullanılmaya devam edebilir, ancak 7.0’da tamamen kaldırılacaklar
- ts5to6 aracı ile
baseUrl, rootDir gibi ayarlar otomatik olarak uyarlanabiliyor
- TypeScript 7.0’ın birkaç ay içinde yayımlanması planlanıyor ve Microsoft içinde ve dışında büyük kod tabanlarında şimdiden geniş ölçüde benimseniyor
- Geri bildirim için native preview nightly build ve VS Code eklentisi öneriliyor
3 yorum
Tamamen Go tabanlı derleyiciye geçilecek zamanı dört gözle bekliyorum!
Ha? TypeScript ileride Go tabanlı native bir yapıya mı geçiyor?
Sadece derleyici.