TypeScript 6.0 diumumkan
(devblogs.microsoft.com)- 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
strictdefaulttrue,targetdefaultes2025, dantypesdefault[] - 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/getOrInsertComputedpada Map, danRegExp.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 pemanggilanimport() - 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
thisimplisit 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
thistidak 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
importsdipackage.json - Sebelumnya, setelah
#wajib ada karakter, sehingga path yang diawali#/tidak bisa digunakan- Hal ini membingungkan pengembang yang terbiasa dengan konvensi prefix
@/di bundler
- Hal ini membingungkan pengembang yang terbiasa dengan konvensi prefix
- Node.js baru-baru ini mulai mendukung subpath imports yang diawali
#/- Memungkinkan mapping ringkas seperti
"#/*": "./dist/*"
- Memungkinkan mapping ringkas seperti
- TypeScript 6.0 mendukung ini pada opsi
--moduleResolution nodenextdanbundler - Diimplementasikan lewat kontribusi dari magic-akari
Kombinasi --moduleResolution bundler dan --module commonjs kini diizinkan
- Sebelumnya,
--moduleResolution bundlerhanya bisa dipakai bersama--module esnextatau--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 bundleratau--module nodenexttetap 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 | 500akan selalu dihasilkan dalam urutan yang sama
- Contoh:
- Jika flag
--stableTypeOrderingdiaktifkan 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, methodIterator, dan methodSetyang sebelumnya ada diesnextkini dipindahkan kees2025- 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 esnextatau"lib": ["esnext"](atauesnext.temporalyang 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
MapdanWeakMapgetOrInsert: jika key tidak ada, sisipkan dan kembalikan nilai default yang ditentukangetOrInsertComputed: 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
esnextdan langsung bisa digunakan di TypeScript 6.0 - Diimplementasikan lewat kontribusi dari Renegade334
RegExp.escape
- Fungsi
RegExp.escapeuntuk meng-escape karakter spesial dalam regex telah mencapai Stage 4 - Disertakan dalam lib
es2025dan 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.tsdanlib.dom.asynciterable.d.tskini sepenuhnya digabungkan kelib.dom.d.tsdom.iterabledandom.asynciterablemasih 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
strictdefaulttrue: karena sebagian besar proyek baru menginginkan mode strict, proyek yang bergantung padafalsesebelumnya perlu menetapkan"strict": falsesecara eksplisitmoduledefaultesnext: mencerminkan kenyataan bahwa ESM telah menjadi format modul dominantargetdefault ke versi ES terbaru yang tersedia (saat inies2025): karena runtime evergreen sudah umum, transpile ke versi lama tak lagi diperlukannoUncheckedSideEffectImportsdefaulttrue: membantu mendeteksi typo pada import yang hanya bertujuan menimbulkan side effectlibReplacementdefaultfalse: 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.jsonberada - 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
- Jika tidak, bisa muncul struktur output yang tidak diinginkan seperti
Default types berubah menjadi []
- Sebelumnya, semua paket di
node_modules/@typesotomatis disertakan, menimbulkan overhead besar pada waktu build- Di repositori umum, sering ada ratusan paket
@typesyang ikut terseret secara transitif
- Di repositori umum, sering ada ratusan paket
- 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": ["*"]
- Perilaku lama bisa dipulihkan dengan
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) ataubundler(untuk bundler/Bun)
Nilai modul AMD, UMD, dan SystemJS deprecated
--module amd,--module umd,--module systemjs, dan--module nonesemuanya 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
baseUrldan menambahkan prefix langsung di entripaths- Contoh:
"@app/*": ["app/*"]→"@app/*": ["./src/app/*"]
- Contoh:
--moduleResolution classic deprecated
- Ini adalah algoritme resolusi modul asli TypeScript, dan kini semua kasus praktis dapat digantikan oleh
nodenextataubundler
esModuleInterop false dan allowSyntheticDefaultImports false deprecated
- Menyetel kedua opsi ini ke
falsetidak lagi dimungkinkan, sehingga perilaku interop yang aman selalu aktif - Perlu menyesuaikan dari
import * as express from "express"menjadiimport express from "express"
--alwaysStrict false deprecated
- Semua kode kini dianggap berada dalam JavaScript strict mode, sehingga kode yang memakai
await,static, atauprivatesebagai 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 dengannamespace Foo { ... } - Deklarasi ambient module berbentuk
declare module "some-module" { ... }tetap didukung - Tujuannya untuk menghindari konflik dengan proposal blok
moduledi ECMAScript
Keyword import asserts deprecated
- Perlu mengubah
import ... asserts { type: "json" }menjadiimport ... 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--noLibatau--libReplacement
Error saat menentukan file command line jika tsconfig.json ada
- Jika menjalankan
tsc foo.tsdan adatsconfig.jsondi 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.