Typescript Template Literal Types Satisfies Const Type Parameters
Definisi
Tiga fitur yang membantu membuat tipe lebih presisi tanpa kehilangan inferensi:
- Template Literal Types: tipe string yang dibentuk dari pola, bisa menggabungkan union dan merekayasa tipe seperti
GET /users. satisfies: memeriksa nilai sesuai tipe tanpa mengubah tipe hasil inferensi (beda denganasyang memaksa, dan:yang menyempitkan).- Const Type Parameters (
constmodifier di generic): mempertahankan literal type dari argumen, bukan lebar kestring.
Kapan dipakai
- Template literal: nama event, route, key config, atau tipe berbasis pola string.
satisfies: ingin validasi struktur tapi tetap bisa akses property secara spesifik (misal warna"red"bukanstring).- Const param: generic function yang harus menjaga literal argumen (berguna di tuple/key extraction).
Cara kerja
Template literal types
type Method = 'GET' | 'POST';
type Path = '/users' | '/posts';
type Endpoint = `${Method} ${Path}`; // 'GET /users' | 'GET /posts' | ...
type Color = `color-${'red' | 'green' | 'blue'}`;satisfies
const palette = {
red: '#f00',
green: '#0f0',
} satisfies Record<string, string>;
// palette.red tetap bertipe '#f00' (literal), bukan string
const c: '#f00' = palette.red; // okKalau pakai const palette: Record<string, string>, palette.red jadi string dan literal hilang.
Const type parameter
function first<const T extends readonly unknown[]>(arr: T): T[number] {
return arr[0];
}
const x = first([1, 2, 3]); // x: 1 (bukan number)Tanpa const, T lebar ke number[] dan hasilnya number.
Struktur alur
Loading diagram...
Contoh endpoint typed
function route(method: Method, path: Path): Endpoint {
return `${method} ${path}`;
}Catatan implementasi
- Template literal sangat kuat untuk branded string API, tapi bisa mengeksplosi kombinasi kalau union terlalu banyak.
satisfiestersedia sejak TS 4.9; sebelumnya harus pakai helper atauas.- Const type parameter (TS 5.0+) berguna untuk tuple inference pada utility seperti
tuple().
Kesalahan umum
- Over-engineering tipe: template literal bersarang membuat tipe sulit dibaca dan compile lambat.
- Salah pakai
as:asmem-bypass cek,satisfieslebih aman untuk validasi. - Const param di tempat tak perlu: membuat signature rumit untuk kasus sederhana.
- Lupa bahwa
satisfiestidak mengubah tipe: jika butuh tipe spesifik eksplisit, tetap perlu anotasi.