satisfies vs Type Assertion dan const Assertions TypeScript
Definisi
Tiga fitur untuk mengontrol presisi tipe tanpa kehilangan inferensi:
satisfies: cek nilai memenuhi tipe tertentu tapi mempertahankan tipe literal/narrow hasil inferensi (bukan mengubah jadi tipe target).- Type assertion (
as/<T>): memberi tahu compiler "percaya saya, ini tipenya" — memotong inferensi, berisiko runtime salah. constassertion (as const): bekukan nilai jadi readonly + literal type paling sempit (tuple, union literal).
Kapan dipakai
- satisfies: saat ingin validasi shape (misal object konfigurasi sesuai interface) tapi tetap dapat autocomplete key literal.
- as const: saat butuh literal tuple/enum-inline yang tidak melebar ke
string/number. - assertion: hindari kalau bisa; hanya saat kamu tahu tipe lebih tepat dari yang disimpulkan compiler (misal cast dari
unknownsetelah guard).
Cara kerja
satisfies mempertahankan literal
type Routes = { home: string; about: string };
const paths = {
home: '/',
about: '/about',
} satisfies Routes;
// paths.home tipe 'string' bukan '/', tapi keys tetap terdeteksiTanpa satisfies, paths.home jadi string dan kamu kehilangan autocomplete key eksak.
const assertion
const role = 'admin' as const; // tipe 'admin', bukan string
const tuple = [1, 2] as const; // readonly [1, 2]assertion (hati-hati)
const el = document.getElementById('x') as HTMLInputElement; // compiler percaya
// lebih aman:
const el2 = document.getElementById('x');
if (el2 instanceof HTMLInputElement) { /* narrowed */ }Struktur alur
Loading diagram...
Contoh kombinasi
const config = {
api: 'https://x',
retries: 3,
} satisfies Config;
const items = ['a', 'b'] as const; // items: readonly ['a','b']
type Item = typeof items[number]; // 'a' | 'b'Catatan implementasi
satisfiestidak mengubah tipe hasil; beda denganas Tyang mengganti tipe.as constmembuat semuanya readonly — cocok untuk konstanta, bukan untuk nilai yang akan dimutasi.- Assertion
asbisa "bohong":const x = '' as numberlolos compile tapi runtime tetap string. - Untuk narrow dari
unknown, preferinstanceof/typeofdaripadaas.
Kesalahan umum
- Pakai
asuntuk bypass: tipe salah, bug saat runtime. satisfiesdikira mengubah tipe: masih literal, bukan tipe target.as constlalu mutate: error karena readonly.- Assertion berantai:
as unknown as Tmenyembunyikan masalah tipe asli.