Jika Anda pernah mengirimkan perbaikan bug dua baris ke monorepo TypeScript dan melihat pipeline build Anda menghabiskan sepuluh menit untuk pengecekan tipe, Anda sudah memahami masalahnya. Penundaan tersebut bukan karena bundling. Bukan juga karena minifikasi. Itu terjadi pada saat TypeScript mencoba menulis file deklarasi Anda. Sebelum dapat menghasilkan satu file .d.ts pun, compiler harus menyelesaikan seluruh graf tipe. Ia menelusuri import, mengevaluasi generics, dan menyimpulkan tipe pengembalian yang mungkin berada tiga lapis kedalaman dependensi. Satu file yang Anda ubah menyentuh file lain, yang menyentuh file ketiga, dan tiba-tiba compiler melakukan pekerjaan detektif di seluruh repositori hanya untuk mendeskripsikan apa yang dikembalikan oleh fungsi Anda.

TypeScript 6.0 memperkenalkan isolatedDeclarations untuk memutus kebiasaan tersebut.

Hambatan yang Sebenarnya

File deklarasi adalah kontrak publik dari kode Anda. Ketika pengembang lain mengimpor paket Anda, TypeScript membaca file .d.ts, bukan sumbernya. Menghasilkan file-file tersebut dengan benar berarti compiler tidak dapat melewati pengecekan tipe. Ia harus mengetahui setiap bentuk, setiap union, dan setiap tipe pengembalian yang disimpulkan sebelum menulis satu baris output pun.

Dalam proyek kecil dengan lima puluh file, hal ini terjadi secara instan. Dalam monorepo besar dengan ribuan modul, ini adalah mimpi buruk yang terserialisasi. Ubah satu tipe utilitas di paket inti, dan compiler akan meninjau kembali setiap konsumen untuk memverifikasi bahwa tipe yang disimpulkan masih valid. Waktu build berskala dengan kedalaman dependensi, bukan hanya jumlah file. Refaktor sepele dapat memicu penghitungan ulang seluruh graf. Tim sering kali menganggap hal ini tidak terhindarkan. Padahal tidak.

Cara Kerja isolatedDeclarations

Flag baru ini mengubah kontrak antara Anda dan compiler. Alih-alih meminta TypeScript untuk menyimpulkan tipe dari export Anda, Anda memberikan anotasi sendiri. Perubahan tunggal tersebut menghilangkan kebutuhan akan pengetahuan global. Compiler tidak lagi harus menganalisis dependensi Anda untuk menghasilkan deklarasi bagi modul Anda. Ia hanya melihat sintaks di depannya.

Ini berarti setiap file dapat menghasilkan output .d.ts-nya secara independen, secara paralel. Alat build tidak perlu membangun graf tipe yang lengkap sebelum memulai pembuatan deklarasi. Alat seperti esbuild dan swc, yang sebelumnya menghindari pembuatan .d.ts karena tidak memiliki pengecek tipe, kini dapat menghasilkan deklarasi dengan kecepatan mendekati transpilasi. Mereka membaca anotasi eksplisit langsung dari sumbernya dan menulis definisi tipe yang sesuai tanpa menyelesaikan persamaan tipe apa pun.

Sebelumnya, pembuatan deklarasi adalah monopoli yang dipegang oleh tsc karena hanya compiler resmi yang memiliki informasi tipe yang diperlukan untuk menghasilkan file .d.ts. Transpiler cepat dapat menghapus tipe atau mengubah sintaks, tetapi mereka tidak dapat menghasilkan definisi tipe. Dengan isolatedDeclarations, pintu terbuka bagi seluruh ekosistem untuk menangani alur kerja deklarasi. Transformasi tersebut menjadi mekanis alih-alih logis. Perbedaan itulah yang mengubah waktu tunggu sepuluh menit menjadi hitungan detik.

Konsekuensi: Eksplisit adalah Standar Baru

Kecepatan datang dengan harga yang jelas. Setiap fungsi, kelas, dan variabel yang diekspor harus menyertakan anotasi tipe yang eksplisit. TypeScript akan menolak untuk menyimpulkan API publik untuk Anda.

Perhatikan utilitas sederhana berikut:

export function getUser(id: number) {
  return fetchUser(id);
}

Dengan isolatedDeclarations diaktifkan, ini akan menghasilkan error. Compiler tidak dapat mengetahui tipe pengembalian dari fetchUser tanpa memeriksanya, dan di bawah flag ini