Jika anda pernah menghantar pembetulan pepijat dua baris ke monorepo TypeScript dan melihat saluran paip binaan anda menghabiskan sepuluh minit untuk pemeriksaan jenis, anda sudah memahami masalahnya. Kelewatan itu bukan disebabkan oleh pembundelan. Ia bukan disebabkan oleh pengecilan. Ia berlaku pada saat TypeScript cuba menulis fail deklarasi anda. Sebelum ia dapat mengeluarkan satu fail .d.ts pun, pengkompil mesti menyelesaikan keseluruhan graf jenis. Ia menelusuri import, menilai generik, dan membuat inferens jenis pulangan yang mungkin terletak tiga lapisan ke dalam kebergantungan. Satu fail yang anda ubah menyentuh fail lain, yang menyentuh fail ketiga, dan tiba-tiba pengkompil melakukan kerja penyiasatan di seluruh repositori hanya untuk menerangkan apa yang dipulangkan oleh fungsi anda.

TypeScript 6.0 memperkenalkan isolatedDeclarations untuk memecahkan tabiat tersebut.

Kekangan Sebenar

Fail deklarasi adalah kontrak awam kod anda. Apabila pembangun lain mengimport pakej anda, TypeScript membaca fail .d.ts, bukan sumbernya. Menghasilkan fail tersebut dengan betul bermakna pengkompil tidak boleh melangkau pemeriksaan jenis. Ia mesti mengetahui setiap bentuk, setiap kesatuan, dan setiap jenis pulangan yang diinferens sebelum ia menulis satu baris output.

Dalam projek kecil dengan lima puluh fail, proses ini berlaku serta-merta. Dalam monorepo besar dengan beribu-ribu modul, ia menjadi mimpi ngeri bersiri. Ubah satu jenis utiliti dalam pakej teras, dan pengkompil akan menyemak semula setiap pengguna untuk mengesahkan bahawa jenis yang diinferens masih sah. Masa binaan meningkat mengikut kedalaman kebergantungan, bukan sekadar jumlah fail. Refaktor yang remeh boleh mencetuskan pengiraan semula keseluruhan graf. Pasukan sering menganggap perkara ini tidak dapat dielakkan. Sebenarnya tidak.

Cara isolatedDeclarations Berfungsi

Bendera baharu ini mengubah kontrak antara anda dan pengkompil. Daripada meminta TypeScript untuk membuat inferens jenis bagi eksport anda, anda menandakannya sendiri. Peralihan tunggal itu menghapuskan keperluan untuk pengetahuan global. Pengkompil tidak lagi perlu menganalisis kebergantungan anda untuk mengeluarkan deklarasi bagi modul anda. Ia hanya melihat sintaks di hadapannya.

Ini bermakna setiap fail boleh mengeluarkan output .d.ts secara bebas dan selari. Alat binaan tidak perlu membina graf jenis yang lengkap sebelum memulakan penjanaan deklarasi. Alat seperti esbuild dan swc, yang sebelum ini mengelakkan pengeluaran .d.ts kerana ketiadaan pemeriksa jenis, kini boleh menjana deklarasi pada kelajuan hampir setanding transpilation. Ia membaca anotasi eksplisit secara terus daripada sumber dan menulis definisi jenis yang sepadan tanpa menyelesaikan sebarang persamaan jenis.

Sebelum ini, pengeluaran deklarasi adalah monopoli oleh tsc kerana hanya pengkompil rasmi yang mempunyai maklumat jenis yang diperlukan untuk menghasilkan fail .d.ts. Transpiler pantas boleh membuang jenis atau menukar sintaks, tetapi ia tidak boleh menjana definisi jenis. Dengan isolatedDeclarations, pintu terbuka luas untuk seluruh ekosistem mengendalikan aliran kerja deklarasi. Transformasi tersebut menjadi bersifat mekanikal dan bukannya logikal. Perbezaan itulah yang menukarkan penantian sepuluh minit kepada beberapa saat sahaja.

Pertukaran: Eksplisit Adalah Standard Baharu

Kelajuan datang dengan harga yang jelas. Setiap fungsi, kelas, dan pemboleh ubah yang dieksport mesti mempunyai anotasi jenis yang eksplisit. TypeScript akan enggan membuat inferens API awam untuk anda.

Pertimbangkan satu utiliti ringkas:

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

Dengan isolatedDeclarations diaktifkan, ini akan menghasilkan ralat. Pengkompil tidak dapat mengetahui jenis pulangan fetchUser tanpa memeriksanya, dan di bawah bendera ini