Strict Mode
strict: true mengaktifkan semua pemeriksaan ketat: apa saja yang berubah.
Kenapa Strict Mode Ada
JavaScript terkenal pemaaf: akses properti dari undefined baru meledak saat runtime, di tangan user. TypeScript tanpa strict mode mewarisi sebagian kelonggaran itu. strict: true adalah satu flag yang mengaktifkan seluruh paket pemeriksaan ketat, mengubah TypeScript dari "pengecek tipe santai" menjadi "penjaga gerbang yang cerewet tapi menyelamatkanmu".
Pengalaman industri konsisten: mayoritas bug yang ditangkap type checker berasal dari dua sumber, yaitu nilai null/undefined yang tidak terduga dan any implisit yang diam-diam mematikan pemeriksaan. Strict mode menyerang tepat kedua sumber itu, di titik paling murah untuk diperbaiki: saat kamu menulis kode.
Apa Saja yang Diaktifkan
| Flag | Yang ditangkap |
|---|---|
noImplicitAny | Parameter/variabel tanpa anotasi yang diam-diam jadi any |
strictNullChecks | null/undefined masuk ke tipe lain tanpa izin |
strictPropertyInitialization | Properti class dipakai sebelum diisi |
noImplicitThis | this tanpa tipe di fungsi |
noUncheckedIndexedAccess | Akses arr[i] yang mungkin undefined (opsional, tidak ikut paket strict) |
Contoh 1: noImplicitAny Menangkap Parameter Liar (TS7006)
function gandakan(x) {
return x * 2;
}
// Error: Parameter 'x' implicitly has an 'any' type. (TS7006)Tanpa strict, x diam-diam menjadi any dan gandakan("halo") lolos compile lalu menghasilkan NaN di runtime. Perbaikannya eksplisit dan murah:
function gandakan(x: number): number {
return x * 2;
}TS7006 hampir selalu berarti kamu lupa anotasi. Jangan "memperbaikinya" dengan x: any, itu sama saja mematikan alarmnya.
Contoh 2: strictNullChecks Menangkap Undefined (TS18048)
Skenario nyata: mencari user di array hasil fetch.
interface User { id: string; nama: string; }
function sapa(users: User[], id: string): string {
const u = users.find((x) => x.id === id);
return `Halo, ${u.nama}`;
// Error: 'u' is possibly 'undefined'. (TS18048)
}find bisa mengembalikan undefined bila tidak ketemu, dan strict mode memaksamu menanganinya, bukan berharap data selalu ada:
function sapa(users: User[], id: string): string {
const u = users.find((x) => x.id === id);
if (!u) return "Halo, tamu";
return `Halo, ${u.nama}`; // di sini u: User, aman
}Perhatikan: setelah guard if (!u), TypeScript mempersempit tipe u menjadi User otomatis. Inilah narrowing bekerja sama dengan strict mode.
Contoh 3: strictPropertyInitialization (TS2564)
class Layanan {
private koneksi: string;
// Error: Property 'koneksi' has no initializer and is not definitely
// assigned in the constructor. (TS2564)
hubungkan(): void {
this.koneksi = "db://utama";
}
}Compiler tahu hubungkan() mungkin belum dipanggil saat properti dipakai. Perbaikan yang benar: isi di constructor atau beri nilai default. Jalan pintasnya adalah definite assignment assertion koneksi!: string, yang dipakai bila kamu yakin framework mengisinya (misal via dependency injection di NestJS/Angular), tapi pakai dengan sadar karena itu mematikan ceknya.
Strategi Migrasi Kode Lama
Jangan nyalakan strict sekaligus di codebase besar yang longgar, kamu akan tenggelam dalam ratusan error. Nyalakan per flag, mulai dari noImplicitAny, perbaiki semuanya, commit, lanjut ke strictNullChecks. Untuk project baru: strict: true sejak hari pertama, tanpa diskusi. Biaya mengetatkan di awal jauh lebih murah daripada berburu bug null di production.
Catatan teknis:
strict: truetidak mengubah satu byte pun JavaScript yang dihasilkan. Ia murni menambah pemeriksaan compile-time, jadi tidak ada alasan performa untuk mematikannya. Flag ini juga tidak sama dengan"use strict"di JavaScript, keduanya hal yang berbeda walaupun namanya mirip.
Tantangan
Ketatkan kode longgar
Kode berikut lolos tanpa strict tapi penuh lubang. Aktifkan mental strict mode: tambahkan anotasi yang tepat, tangani kemungkinan undefined, dan pastikan tidak ada implicit any. Tulis ulang hingga bersih.
function ambilNama(users, id) {
const u = users.find((x) => x.id === id);
return u.nama;
}
// users: array of { id: string; nama: string }