- Rilis terakhir berbasis codebase JavaScript saat ini, sekaligus rilis jembatan untuk menyiapkan transisi ke TypeScript 7.0, port native yang ditulis dengan Go
- Mencakup peningkatan inferensi tipe dan resolusi modul, seperti pelonggaran sensitivitas konteks untuk fungsi yang tidak menggunakan
this, serta dukungan subpath imports yang diawali #/
- Modernisasi besar-besaran nilai default opsi compiler, termasuk
strict default true, target default es2025, dan types default []
- Deprecation besar-besaran opsi lawas, seperti target ES5, modul AMD/UMD/SystemJS,
--baseUrl, dan --moduleResolution node10
- Penambahan dukungan tipe untuk proposal ECMAScript Stage 4 terbaru, seperti Temporal API,
getOrInsert/getOrInsertComputed pada Map, dan RegExp.escape
Posisi TypeScript 6.0
- Rilis terakhir berbasis codebase JavaScript saat ini, berperan sebagai jembatan menuju TypeScript 7.0 (port native Go)
- TypeScript 7.0 memanfaatkan kode native dan multithreading shared-memory, dan saat ini sudah sangat dekat dengan selesai
- Sebagian besar perubahan di 6.0 ditujukan untuk menyelaraskan dan mempersiapkan adopsi 7.0
- TypeScript 7.0 sudah bisa dicoba lebih awal lewat ekstensi VS Code atau paket npm
Perubahan sejak Beta dan RC
- Penyesuaian type checking pada function expression dalam pemanggilan generik, khususnya ekspresi JSX generik — dapat menangkap lebih banyak bug pada kode yang ada, tetapi beberapa pemanggilan generik mungkin memerlukan argumen tipe eksplisit
- Penerapan perluasan deprecation sintaks import assertion (
assert) juga pada pemanggilan import()
- Pembaruan tipe DOM — mencerminkan standar web terbaru, termasuk penyesuaian terkait Temporal API
Pelonggaran sensitivitas konteks untuk fungsi yang tidak menggunakan this
- Dalam inferensi tipe, TypeScript mengklasifikasikan fungsi dengan parameter tanpa tipe eksplisit sebagai fungsi sensitif konteks (contextually sensitive function), lalu memprosesnya belakangan dalam urutan inferensi
- Fungsi yang ditulis dengan sintaks method memiliki parameter
this implisit sehingga, tidak seperti arrow function, selalu diperlakukan sebagai sensitif konteks
- Akibatnya, inferensi tipe kadang gagal bergantung pada urutan method dalam object literal
- Di TypeScript 6.0, fungsi yang sebenarnya tidak memakai
this tidak lagi dianggap sensitif konteks
- Fungsi-fungsi tersebut mendapat prioritas lebih tinggi dalam inferensi tipe, sehingga inferensi berjalan normal terlepas dari urutan method
- Diimplementasikan lewat kontribusi dari Mateusz Burzyński
Dukungan Subpath Imports yang diawali #/
- Fitur subpath imports di Node.js memungkinkan definisi alias untuk modul internal paket melalui field
imports di package.json
- Sebelumnya, setelah
# wajib ada karakter, sehingga path yang diawali #/ tidak bisa digunakan
- Hal ini membingungkan pengembang yang terbiasa dengan konvensi prefix
@/ di bundler
- Node.js baru-baru ini mulai mendukung subpath imports yang diawali
#/
- Memungkinkan mapping ringkas seperti
"#/*": "./dist/*"
- TypeScript 6.0 mendukung ini pada opsi
--moduleResolution nodenext dan bundler
- Diimplementasikan lewat kontribusi dari magic-akari
Kombinasi --moduleResolution bundler dan --module commonjs kini diizinkan
- Sebelumnya,
--moduleResolution bundler hanya bisa dipakai bersama --module esnext atau --module preserve
- Karena
--moduleResolution node (node10) deprecated, kombinasi baru ini menjadi jalur upgrade yang paling cocok untuk banyak proyek
- Dalam jangka panjang, migrasi ke
--module preserve + --moduleResolution bundler atau --module nodenext tetap direkomendasikan
Flag --stableTypeOrdering
- Type ID yang diberikan ke tipe di internal TypeScript ditentukan oleh urutan pemrosesan, dan ini dipakai untuk mengurutkan union type
- Akibatnya bisa muncul perilaku tak terduga, yaitu hasil emit deklarasi berubah tergantung urutan deklarasi
- TypeScript 7.0 akan memperkenalkan type checking paralel, sehingga untuk mengatasi masalah penetapan ID non-deterministik, digunakan algoritme pengurutan deterministik berbasis konten
- Contoh:
100 | 500 akan selalu dihasilkan dalam urutan yang sama
- Jika flag
--stableTypeOrdering diaktifkan di 6.0, perilaku pengurutan tipe akan disamakan dengan 7.0, mengurangi perbedaan antara kedua codebase
- Bisa menimbulkan penurunan performa hingga 25% pada type checking
- Jika muncul error tipe karena perbedaan inferensi, bisa diatasi dengan menambahkan argumen tipe eksplisit atau anotasi variabel
- Flag ini dimaksudkan hanya untuk diagnosis migrasi dari 6.0 ke 7.0, tidak direkomendasikan untuk pemakaian jangka panjang
Opsi es2025 (target dan lib)
- ES2025 tidak membawa fitur bahasa JavaScript baru, tetapi menambahkan tipe built-in API seperti
RegExp.escape
Promise.try, method Iterator, dan method Set yang sebelumnya ada di esnext kini dipindahkan ke es2025
- Diimplementasikan lewat kontribusi dari Kenta Moriuchi
Dukungan tipe Temporal API
- Type built-in untuk proposal Temporal yang telah mencapai Stage 4 kini disertakan di TypeScript 6.0
- Bisa digunakan dengan
--target esnext atau "lib": ["esnext"] (atau esnext.temporal yang lebih spesifik)
- API seperti
Temporal.Now.instant().subtract() dan .add() kini dapat dipakai dengan type safety
- Sudah tersedia di beberapa runtime dan, dengan status Stage 4, menjadi bagian resmi dari bahasa JavaScript
- Diimplementasikan lewat kontribusi dari Renegade334
Dukungan tipe untuk method "upsert" pada Map (getOrInsert / getOrInsertComputed)
- Menyederhanakan pola berulang saat memeriksa apakah key ada di Map lalu menetapkan nilai default jika tidak ada
- Proposal ECMAScript "upsert" telah mencapai Stage 4, menambahkan dua method baru ke
Map dan WeakMap
getOrInsert: jika key tidak ada, sisipkan dan kembalikan nilai default yang ditentukan
getOrInsertComputed: saat biaya pembuatan nilai default besar, gunakan callback untuk menghitungnya secara lazy
- Callback menerima key sebagai argumen, sehingga juga bisa dipakai untuk membuat nilai default berbasis key
- Ditambahkan ke lib
esnext dan langsung bisa digunakan di TypeScript 6.0
- Diimplementasikan lewat kontribusi dari Renegade334
RegExp.escape
- Fungsi
RegExp.escape untuk meng-escape karakter spesial dalam regex telah mencapai Stage 4
- Disertakan dalam lib
es2025 dan tersedia di TypeScript 6.0
- Diimplementasikan lewat kontribusi dari Kenta Moriuchi
Integrasi dom.iterable dan dom.asynciterable ke dalam lib dom
- Sebelumnya, untuk memakai iterasi pada
NodeList, HTMLCollection, dan sebagainya, perlu mendeklarasikan "lib": ["dom", "dom.iterable"]
- Di TypeScript 6.0, isi
lib.dom.iterable.d.ts dan lib.dom.asynciterable.d.ts kini sepenuhnya digabungkan ke lib.dom.d.ts
dom.iterable dan dom.asynciterable masih bisa direferensikan, tetapi kini berupa file kosong
- Karena semua browser modern utama sudah mendukung fitur tersebut, ini merupakan peningkatan kenyamanan yang menghilangkan sumber kebingungan umum
Perubahan default utama
strict default true: karena sebagian besar proyek baru menginginkan mode strict, proyek yang bergantung pada false sebelumnya perlu menetapkan "strict": false secara eksplisit
module default esnext: mencerminkan kenyataan bahwa ESM telah menjadi format modul dominan
target default ke versi ES terbaru yang tersedia (saat ini es2025): karena runtime evergreen sudah umum, transpile ke versi lama tak lagi diperlukan
noUncheckedSideEffectImports default true: membantu mendeteksi typo pada import yang hanya bertujuan menimbulkan side effect
libReplacement default false: meningkatkan performa default dengan mencegah kegagalan resolusi modul yang tidak perlu dan bertambahnya target watch
Default rootDir berubah menjadi .
- Sebelumnya, jika tidak ditentukan, nilainya ditentukan dengan menginfer direktori bersama dari semua file input non-deklarasi
- Ini menimbulkan masalah karena untuk menentukan apakah sebuah file termasuk ke proyek, proyek tersebut harus dimuat dan diparse lebih dulu
- Di TypeScript 6.0, default kini ditetapkan tetap ke direktori tempat
tsconfig.json berada
- Jika source file berada lebih dalam daripada
tsconfig.json, perlu menetapkan "rootDir": "./src" atau serupa secara eksplisit
- Jika tidak, bisa muncul struktur output yang tidak diinginkan seperti
./dist/src/index.js
Default types berubah menjadi []
- Sebelumnya, semua paket di
node_modules/@types otomatis disertakan, menimbulkan overhead besar pada waktu build
- Di repositori umum, sering ada ratusan paket
@types yang ikut terseret secara transitif
- Di TypeScript 6.0, default diubah menjadi
[] (array kosong), sehingga file deklarasi yang tidak perlu tidak dimuat
- Tercatat ada peningkatan waktu build 20~50% dalam kasus nyata
- Sebagian besar proyek perlu menetapkan
"types": ["node"] atau "types": ["node", "jest"] secara eksplisit
- Perilaku lama bisa dipulihkan dengan
"types": ["*"]
Item deprecation
target: es5 deprecated
- Target ES5 hampir tidak lagi punya use case karena IE sudah pensiun dan browser evergreen sudah umum
- Target minimum berubah menjadi ES2015; jika masih butuh output ES5, disarankan memakai compiler eksternal
--downlevelIteration deprecated
- Karena hanya berpengaruh pada emit ES5, flag ini kehilangan tujuan setelah target ES5 deprecated
--moduleResolution node (node10) deprecated
- Opsi ini mencerminkan algoritme resolusi modul Node.js 10, sehingga tidak sesuai dengan perilaku Node.js modern
- Disarankan migrasi ke
nodenext (langsung menargetkan Node.js) atau bundler (untuk bundler/Bun)
Nilai modul AMD, UMD, dan SystemJS deprecated
--module amd, --module umd, --module systemjs, dan --module none semuanya tidak lagi didukung
- Karena ESM sudah didukung luas di browser dan Node.js, perlu beralih ke bundler atau target ESM
--baseUrl deprecated
- Sebelumnya sering dipakai sebagai prefix untuk
paths, tetapi juga berfungsi sebagai lookup root pada resolusi modul, yang dapat memicu masalah resolusi path yang tidak diinginkan
- Migrasikan dengan menghapus
baseUrl dan menambahkan prefix langsung di entri paths
- Contoh:
"@app/*": ["app/*"] → "@app/*": ["./src/app/*"]
--moduleResolution classic deprecated
- Ini adalah algoritme resolusi modul asli TypeScript, dan kini semua kasus praktis dapat digantikan oleh
nodenext atau bundler
esModuleInterop false dan allowSyntheticDefaultImports false deprecated
- Menyetel kedua opsi ini ke
false tidak lagi dimungkinkan, sehingga perilaku interop yang aman selalu aktif
- Perlu menyesuaikan dari
import * as express from "express" menjadi import express from "express"
--alwaysStrict false deprecated
- Semua kode kini dianggap berada dalam JavaScript strict mode, sehingga kode yang memakai
await, static, atau private sebagai identifier biasa perlu mengganti nama
outFile deprecated
- Fitur ini dulu dipakai untuk menggabungkan banyak file input menjadi satu, tetapi kini telah digantikan oleh bundler eksternal seperti Webpack, Rollup, esbuild, dan Vite
- Ini merupakan keputusan untuk memfokuskan TypeScript pada peran intinya, yaitu type checking dan emit deklarasi
Sintaks module lawas (deklarasi namespace) deprecated
- Sintaks
module Foo { ... } kini hard-deprecated, dan perlu diganti dengan namespace Foo { ... }
- Deklarasi ambient module berbentuk
declare module "some-module" { ... } tetap didukung
- Tujuannya untuk menghindari konflik dengan proposal blok
module di ECMAScript
Keyword import asserts deprecated
- Perlu mengubah
import ... asserts { type: "json" } menjadi import ... with { type: "json" }
- Ini mengikuti perubahan proposal import assertions menjadi proposal import attributes (keyword
with)
Direktif no-default-lib deprecated
/// <reference no-default-lib="true"/> tidak lagi didukung; disarankan memakai --noLib atau --libReplacement
Error saat menentukan file command line jika tsconfig.json ada
- Jika menjalankan
tsc foo.ts dan ada tsconfig.json di direktori yang sama, kini akan terjadi error
- Bisa diabaikan secara eksplisit dengan flag
--ignoreConfig
Persiapan untuk TypeScript 7.0
- Opsi yang deprecated di 6.0 masih bisa dipakai tanpa error dengan setelan
"ignoreDeprecations": "6.0", tetapi akan dihapus sepenuhnya di 7.0
- Alat ts5to6 dapat membantu menyesuaikan
baseUrl, rootDir, dan lainnya secara otomatis
- TypeScript 7.0 dijadwalkan rilis dalam beberapa bulan ke depan, dan sudah diadopsi luas pada codebase besar di dalam maupun luar Microsoft
- Umpan balik sangat dianjurkan melalui build nightly native preview dan ekstensi VS Code
3 komentar
Saya menantikan saat transisi penuh ke compiler berbasis Go terjadi!
Hah? TypeScript nanti bakal berubah jadi native berbasis Go?
Hanya kompilernya.