# TypeScript Strict Mode di Produksi: Mengapa Ini Tidak Bisa Ditawar

> Mengapa TypeScript strict mode ada di setiap basis kode produksi — bug yang ditangkap, gotcha yang muncul, dan cara mengaktifkannya di proyek warisan.

URL: https://www.matthewswong.com/id/blog/typescript-strict-mode-production/

- Author: Matthews Wong (https://www.matthewswong.com/id/about/)
- Published: 2025-06-10
- Updated: 2025-06-10
- Category: Web Dev

Aplikasi yang dibangun dengan TypeScript strict mode yang diaktifkan mengalami sekitar 40% lebih sedikit bug terkait tipe yang mencapai produksi. Saya telah mengaktifkan strict mode di setiap proyek yang saya sentuh selama dua tahun terakhir, termasuk selama migrasi proyek warisan. Rasa sakit awal — dinding error tipe saat Anda pertama kali membalik sakelar — nyata. Tapi apa yang strict mode ungkap lebih berharga dari fitur apa pun yang bisa Anda bangun selama jendela refaktor tersebut.

## Apa yang strict Mode Sebenarnya Aktifkan

Flag strict di tsconfig.json adalah singkatan untuk sekelompok pemeriksaan individual: strictNullChecks, noImplicitAny, strictFunctionTypes, strictBindCallApply, strictPropertyInitialization, dan noImplicitThis. Masing-masing menangani kategori bug runtime yang berbeda.

### strictNullChecks: Yang Paling Penting

Sebelum strictNullChecks, TypeScript membiarkan string | null | undefined semuanya diperlakukan sebagai string. Beginilah Anda mendapatkan Cannot read properties of null (reading 'name') di produksi — error yang menyumbang lebih banyak insiden produksi dari penyebab tunggal lainnya. Dengan strictNullChecks diaktifkan, TypeScript memaksa Anda menangani null dan undefined secara eksplisit. user?.name alih-alih user.name.

> Dari mengaktifkan strict mode pada basis kode NestJS + Next.js ERP warisan dengan 15.000 baris: jangan aktifkan semua flag strict sekaligus. Aktifkan strictNullChecks terlebih dahulu (ia memiliki rasio sinyal-ke-noise tertinggi untuk bug nyata), perbaiki, lalu aktifkan noImplicitAny, lalu sisanya. Pendekatan bertahap ini memungkinkan Anda mengirimkan migrasi secara bertahap tanpa penulisan ulang besar-besaran.

## Apa yang Strict Mode Tangkap Sebelum Produksi

Dalam aplikasi Next.js berbasis Prisma, tangkapan paling umum adalah: (1) findUnique() mengembalikan T | null — tanpa strictNullChecks, Anda akan mengakses hasilnya langsung dan crash saat catatan tidak ada. (2) Array.find() mengembalikan T | undefined. (3) Optional chaining pada respons API. (4) Inisialisasi properti kelas — strict mode menangkap layanan NestJS di mana dependensi tidak diinjeksikan dengan benar.

### Strict Mode dan Library Pihak Ketiga

Beberapa library lama memiliki paket @types yang tidak sepenuhnya kompatibel dengan strict mode — mereka akan mengembalikan any dari fungsi yang biasanya ditangkap strict mode. Solusinya: tulis fungsi wrapper yang sempit yang menambahkan tipe yang diharapkan strict mode. Untuk klien API, gunakan Zod untuk mengurai dan mengetik respons API di batas — ini memberi Anda keamanan tipe runtime DAN memenuhi analisis statis strict mode.

> **Mengaktifkan strict Mode pada Basis Kode Warisan Besar**

> Mengaktifkan strict mode pada basis kode yang ada yang besar akan menghasilkan ratusan atau ribuan error — jangan biarkan ini menghalangi Anda. Gunakan pendekatan yang direkomendasikan tim TypeScript: aktifkan strict di tsconfig.json tapi tambahkan 'skipLibCheck: true' sementara, dan gunakan @ts-expect-error secara jarang untuk kasus yang akan Anda tangani nanti. Lacak jumlah error Anda sebagai metrik. Saya mengurangi satu proyek warisan dari 847 error strict menjadi 0 selama tiga minggu sambil mengirimkan fitur secara paralel.

## Performa dan Dampak Compiler

Strict mode membuat compiler TypeScript bekerja lebih keras — pemeriksaan tipe lebih menyeluruh. Waktu build meningkat secara moderat (5-15% biasanya). Sebagai gantinya, Anda mendapatkan autocomplete IDE yang lebih baik (IntelliSense lebih akurat dengan tipe strict), jump-to-definition yang lebih baik, dan dukungan refactoring yang lebih baik. Peningkatan pengalaman pengembang dari IntelliSense yang lebih baik saja membenarkan peningkatan waktu kompilasi.

## Yang Saya Gunakan dan Mengapa

strict: true ada di tsconfig.json setiap proyek yang saya mulai. Tanpa pengecualian. Untuk proyek NestJS, saya mengaktifkannya secara eksplisit di tsconfig.json bersama strictPropertyInitialization: true (yang tidak diaktifkan NestJS secara default karena dependency injection membingungkan pemeriksa inisialisasi properti — gunakan Definite Assignment Assertion ! pada properti yang diinjeksikan).

## Strict Mode Melampaui tsconfig

TypeScript strict mode adalah baseline, bukan langit-langit. Lapisi di atasnya: ESLint dengan aturan @typescript-eslint/recommended (terutama no-explicit-any dan no-non-null-assertion), Zod untuk validasi runtime di batas API, dan ts-reset untuk koreksi tipe global. Stack ini memberi Anda keamanan tipe di compile-time + lint-time + runtime — tiga lapisan perlindungan terhadap ketidakcocokan bentuk.

## Sumber & Bacaan Lanjut

- TypeScript Docs — TSConfig strict option — https://www.typescriptlang.org/tsconfig/strict.html
- Bamandev — TypeScript Strict Mode Production Type Safety — https://bamandev.com/blog/typescript-strict-mode-production-type-safety
- Medium — TypeScript Strict Mode: Stop Paying the Bug Tax — https://medium.com/@2nick2patel2/typescript-strict-mode-stop-paying-the-bug-tax-f3fc74c2e219

## Source links

- https://www.typescriptlang.org/tsconfig/strict.html
- https://bamandev.com/blog/typescript-strict-mode-production-type-safety
- https://medium.com/@2nick2patel2/typescript-strict-mode-stop-paying-the-bug-tax-f3fc74c2e219

## FAQ

### Apa saja yang sebenarnya diaktifkan oleh flag `strict` di TypeScript?

Flag `strict` di `tsconfig.json` adalah singkatan yang mengaktifkan sekelompok pemeriksaan individual: `strictNullChecks`, `noImplicitAny`, `strictFunctionTypes`, `strictBindCallApply`, `strictPropertyInitialization`, dan `noImplicitThis`. Masing-masing menangani kategori bug runtime yang berbeda. Mengaktifkan satu flag `strict: true` setara dengan mengaktifkan semuanya sekaligus.

### Apa pendekatan yang disarankan untuk mengaktifkan strict mode pada basis kode warisan yang besar?

Daripada mengaktifkan semua flag strict sekaligus, artikel ini menyarankan pendekatan bertahap: aktifkan `strictNullChecks` terlebih dahulu karena memiliki rasio sinyal-ke-noise tertinggi untuk bug nyata, perbaiki error tersebut, lalu aktifkan `noImplicitAny`, kemudian sisanya. Anda bisa menggunakan `skipLibCheck: true` sementara dan `@ts-expect-error` secara jarang sebagai jalan keluar. Penulis berhasil mengurangi satu proyek warisan dari 847 error strict menjadi nol selama tiga minggu sambil tetap mengirimkan fitur secara paralel.

### Mengapa `strictNullChecks` dianggap sebagai pemeriksaan strict yang paling penting?

Sebelum `strictNullChecks`, TypeScript mengizinkan `null` dan `undefined` ditetapkan ke tipe apa pun — inilah akar penyebab error `Cannot read properties of null` yang menyumbang lebih banyak insiden produksi dari penyebab tunggal lainnya. Dengan flag ini diaktifkan, TypeScript memaksa penanganan `null` dan `undefined` secara eksplisit, sehingga operator seperti optional chaining (`?.`) dan nullish coalescing (`??`) menjadi bagian yang disengaja dalam basis kode.

### Bagaimana Zod dapat melengkapi TypeScript strict mode?

Tipe statis TypeScript tidak ada saat runtime, sehingga tidak bisa memvalidasi data yang datang dari respons API eksternal. Artikel ini menyarankan penggunaan Zod untuk mengurai dan mengetik respons API di batas — ini memberikan keamanan tipe saat runtime sekaligus memenuhi persyaratan analisis statis strict mode. Untuk library pihak ketiga lama yang paket `@types`-nya mengembalikan `any`, menulis fungsi wrapper yang sempit dengan tipe eksplisit dapat mencapai efek yang sama.

### Apakah mengaktifkan strict mode berpengaruh nyata pada performa build?

Strict mode mengharuskan compiler TypeScript melakukan pemeriksaan tipe yang lebih menyeluruh, yang biasanya meningkatkan waktu build sebesar 5–15%. Artikel ini berpendapat bahwa pertukaran ini sepadan karena tipe strict juga meningkatkan akurasi IntelliSense di IDE, keandalan jump-to-definition, dan dukungan refactoring — peningkatan pengalaman pengembang yang membenarkan kenaikan waktu kompilasi yang moderat.

---

- HTML version: https://www.matthewswong.com/id/blog/typescript-strict-mode-production/
- English: https://www.matthewswong.com/en/blog/typescript-strict-mode-production/
- Site index for agents: https://www.matthewswong.com/llms.txt
- Sitemap: https://www.matthewswong.com/sitemap.xml
- API description (OpenAPI): https://www.matthewswong.com/openapi.json
