Sintaks parameter jenis const baharu TypeScript membolehkan fungsi mengekalkan jenis literal secara utuh tanpa memaksa pemanggil untuk menyebarkan as const di mana-mana, sekali gus mengurangkan punca utama pepijat peluasan jenis (type-widening).

Masalah peluasan yang menghantui kod generik

Apabila fungsi generik menerima objek literal, pengkompil akan meluaskan sebarang sifat literal kepada jenis primitif yang lebih luas.

function call<T>(arg: T) {}
call({ method: "GET" })   // T is inferred as { method: string }

Literal "GET" mengecil menjadi string. Kod hiliran yang bergantung pada nilai tepat—seperti discriminated unions atau pengekstrakan template-literal—akan rosak kerana jenis tersebut tidak lagi membawa literal yang tepat. Pembangun telah lama mengatasi perkara ini dengan menulis { method: "GET" } as const pada tapak panggilan, yang memberitahu pengkompil untuk mengekalkan literal tersebut, tetapi penyelesaian itu terletak di tangan pemanggil, bukannya pada definisi fungsi.

Parameter jenis const: penyelesaian pada tahap tandatangan

Pengubah suai const baharu pada parameter jenis memberitahu pengkompil untuk membuat inferens bagi jenis yang paling sempit yang mungkin untuk argumen generik tersebut. Mengisytiharkan fungsi sebagai function foo<const T>(arg: T) menjadikan T berkelakuan secara automatik seolah-olah pemanggil telah menulis as const.

  • Literal string, nombor, boolean kekal dengan nilai tepatnya ("GET" dan bukannya string).
  • Array menjadi tupel readonly dengan setiap elemen ditaip secara tepat.
  • Objek bertukar menjadi struktur deeply readonly, mengekalkan jenis literal pada setiap tahap sarang (nesting).

Oleh kerana kekangan tersebut berada dalam tandatangan fungsi, setiap pemanggil mendapat manfaat secara automatik; terlupa melakukan penukaran jenis (cast) bukan lagi punca kepada ketidakselarasan (unsoundness).

Mengapa ia lebih baik daripada helah as const klasik

as const ialah penyelesaian di pihak pemanggil. Ia memerlukan setiap pengguna fungsi generik untuk ingat menambah pengesahan (assertion). Terlepas satu panggilan sahaja, keselamatan jenis akan hilang. Parameter jenis const memindahkan tanggungjawab ke dalam reka bentuk API itu sendiri: fungsi tersebut mengisytiharkan "Saya perlukan bentuk paling sempit bagi apa sahaja yang anda hantar," dan pengkompil akan menguatkuasakannya.

Peralihan itu sangat penting bagi perpustakaan (libraries) dan utiliti yang mendedahkan pembina generik (generic builders), kilang konfigurasi (configuration factories), atau mana-mana API di mana nilai literal sesuatu medan memacu logik jenis. Penulis perpustakaan boleh menjamin inferens yang betul tanpa perlu mengawal kod hiliran.

Senario dunia nyata yang mendapat manfaat

  • Pembina konfigurasi – nama persekitaran ("dev" | "prod") kekal sebagai literal, membolehkan semakan discriminated-union tanpa penukaran jenis tambahan.
  • Definisi laluan API – rentetan laluan kekal tepat, membolehkan jenis template-literal mengekstrak parameter ("/users/:id"\/users/${string}``).
  • Pembantu mesin keadaan (state-machine) – pengenal pasti keadaan kekal sebagai literal tetap melalui rantaian kaedah (method chaining), menghalang ketidakpadanan keadaan yang tidak disengajakan.

Dalam setiap kes, parameter const menghapuskan kod lewah (boilerplate) as const yang berulang dan mengurangkan kemungkinan pepijat halus terlepas.

Digabungkan dengan operator satisfies

Operator satisfies mengesahkan bahawa sesuatu nilai mematuhi jenis struktur sambil mengekalkan maklumat literal asalnya. Menggunakan kedua-duanya bersama memberikan yang terbaik daripada kedua-dua dunia: parameter const menyediakan inferens yang sempit, dan satisfies memastikan nilai tersebut memenuhi bentuk yang diperlukan.

function makeConfig<const C>(cfg: C) {
  // cfg is inferred with exact literals
}
const cfg = {
  env: "staging",
  ports: [8080, 8443],
} satisfies { env: string; ports: number[] };
makeConfig(cfg); // works, literals stay intact

Bila perlu mengekalkan as const

Parameter const sangat berguna apabila anda mengawal tandatangan fungsi tersebut. Jika anda berurusan dengan fungsi pihak ketiga yang tidak mempunyai pengubah suai tersebut, atau anda memerlukan pemeliharaan literal sekali guna untuk pemboleh ubah tempatan, as const kekal sebagai alat yang betul. Ia masih berfungsi sebagai cara utama untuk membekukan nilai tanpa mengubah API yang dipanggil.

Apa yang perlu diperhatikan seterusnya

Ciri ini masih baharu, jadi peralatan (tooling) dan corak komuniti sedang berkembang. Jangkakan kemas kini sokongan IDE yang memaparkan sintaks baharu dalam fungsi autocomplete dan cadangan quick-fix. Perhatikan penyelenggara perpustakaan: ramai yang akan mula memindahkan generik awam kepada parameter const, yang mungkin memperkenalkan perubahan yang memecahkan (breaking changes) kod yang sebelum ini bergantung pada penukaran as const secara eksplisit.

Rumusan: Dengan menyematkan pemeliharaan literal secara terus ke dalam parameter jenis fungsi, parameter jenis const TypeScript menghapuskan punca biasa ralat peluasan dan memindahkan keselamatan daripada pemanggil kembali kepada pereka API. Gunakannya untuk mana-mana titik masuk generik yang anda miliki; simpan as const untuk nilai tempatan atau API luaran.