8 poin oleh GN⁺ 2026-03-25 | 3 komentar | Bagikan ke WhatsApp
  • 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

 
tsboard 2026-03-26

Saya menantikan saat transisi penuh ke compiler berbasis Go terjadi!

 
princox 2026-03-25

Hah? TypeScript nanti bakal berubah jadi native berbasis Go?

 
helio 2026-03-25

Hanya kompilernya.