TypeScript 6.0 duyuruldu
(devblogs.microsoft.com)- 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
thiskullanmayan 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çeriyorstrictvarsayılanınıntrueolması,targetvarsayılanınınes2025,typesvarsayılanının[]olması gibi derleyici seçeneklerinin varsayılanlarında kapsamlı modernizasyon- ES5 hedefi, AMD/UMD/SystemJS modülleri,
--baseUrl,--moduleResolution node10gibi çok sayıda eski seçeneğin kullanımdan kaldırılması (deprecation) - Temporal API, Map’in
getOrInsert/getOrInsertComputed,RegExp.escapegibi 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
thisparametresi 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
thisgerç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.jsoniçindekiimportsalanı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
- Bu da paketleyicilerde
- 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 nodenextvebundlerseçeneklerinde destekliyor - magic-akari’nin katkısıyla hayata geçirildi
--moduleResolution bundler ile --module commonjs kombinasyonuna izin verilmesi
- Önceden
--moduleResolution bundleryalnızca--module esnextveya--module preserveile 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 bundlerya da--module nodenextyö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 | 500her zaman aynı sırayla yazdırılır
- Örneğin
- 6.0’da
--stableTypeOrderingbayrağı 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
esnextiçinde yer alanPromise.try,Iteratormethod’ları veSetmethod’larıes2025iç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 esnextveya"lib": ["esnext"](ya da daha ayrıntılıesnext.temporal) ile kullanılabiliyorTemporal.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
MapileWeakMapiçin iki yeni method ekledigetOrInsert: Anahtar yoksa belirtilen varsayılan değeri ekler ve döndürürgetOrInsertComputed: 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
esnextlib’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.escapefonksiyonu Stage 4’e ulaştı es2025lib’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,HTMLCollectiongibi yapılarda yineleme kullanmak için"lib": ["dom", "dom.iterable"]belirtmek gerekiyordu - TypeScript 6.0’da
lib.dom.iterable.d.tsvelib.dom.asynciterable.d.tsiçerikleri tamamenlib.dom.d.tsiçine entegre edildidom.iterablevedom.asynciterablehâ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
strictvarsayılanıtrue: Yeni projelerin çoğu strict mod ister; daha öncefalsevarsayımına dayanan projelerin açıkça"strict": falseayarlaması yapması gerekirmodulevarsayılanıesnext: ESM’in baskın modül formatı haline gelmesini yansıtıyortargetvarsayılanı en güncel ES sürümü (şu andaes2025): Evergreen çalışma zamanlarının yaygınlaşması sayesinde eski sürümlere transpile etmek çoğunlukla gereksiznoUncheckedSideEffectImportsvarsayılanıtrue: Yalnızca side effect için yapılan import’lardaki yazım hatalarını yakalamaya yardımcı olurlibReplacementvarsayı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.jsondosyası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.jsgibi istenmeyen çıktı yapıları oluşabilir
- Aksi halde
types varsayılanının [] olarak değişmesi
- Önceden
node_modules/@typesiçindeki tüm paketler otomatik dahil edildiği için derleme süresinde ciddi ek yük oluşuyordu- Tipik depolarda yüzlerce
@typespaketi dolaylı olarak dahil olabiliyordu
- Tipik depolarda yüzlerce
- 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) veyabundler(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 noneartı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
pathsiç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
baseUrlkaldırılıp önek doğrudanpathsgirdilerine eklenmeli- Örnek:
"@app/*": ["app/*"]→"@app/*": ["./src/app/*"]
- Örnek:
--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ı
nodenextveyabundlerile karşılanabiliyor
esModuleInterop false ve allowSyntheticDefaultImports false kullanımdan kaldırıldı
- Bu iki seçeneğin
falseolması 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,privategibi 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ı; yerinenamespace Foo { ... }kullanılmalıdeclare module "some-module" { ... }biçimindeki ambient module bildirimleri ise desteklenmeye devam ediyor- Amaç, ECMAScript’in
moduleblock ö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 (
withanahtar 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--noLibveya--libReplacementöneriliyor
tsconfig.json varsa komut satırında dosya belirtme hatası
tsc foo.tsçalıştırıldığında aynı dizindetsconfig.jsonvarsa hata oluşacak- Bunu açıkça yok saymak için
--ignoreConfigbayrağı 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,rootDirgibi 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.