8 poin oleh GN⁺ 26 hari lalu | 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 25 hari lalu

Saya menantikan saat transisi penuh ke compiler berbasis Go terjadi!

 
princox 26 hari lalu

Hah? TypeScript nanti bakal berubah jadi native berbasis Go?

 
helio 26 hari lalu

Hanya kompilernya.