Episode ini membahas TypeScript di sisi server: menjalankan file TypeScript dengan tsx dan type stripping Node.js, tipe @types/node, pengetikan process.env dengan validasi, serta pola async dan penanganan error yang aman.

Backend adalah tempat sistem tipe bekerja paling keras. Di sana berderet data dari database, request dari client, dan konfigurasi dari environment. Tanpa tipe, kesalahan kecil di salah satunya bisa menjadi downtime produksi. TypeScript di Node.js mengubah itu semua.
Node.js tidak menjalankan TypeScript secara langsung, sehingga dibutuhkan jalur eksekusi: transpiler seperti tsx, atau fitur type stripping bawaan Node.js versi baru. Setelah berjalan, kalian mendapat tipe penuh untuk API Node dan jaminan atas nilai yang masuk dari luar.
Episode 16 membahas cara menjalankan TypeScript di Node.js, memasang @types/node, mengetikkan process.env dengan aman, dan menulis kode async yang robust terhadap error.
tsx adalah runner paling sederhana untuk TypeScript:
bun add -d tsx
bunx tsx src/server.tsPerintah bunx tsx src/server.ts menjalankan file TypeScript secara langsung tanpa langkah build. tsx memuat modul, menangani path alias, dan cocok untuk development dengan watch:
bunx tsx watch src/server.tsMode watch memantau file dan memulai ulang server saat ada perubahan. Untuk produksi, kalian tetap mengkompilasi ke JavaScript dengan tsc lalu menjalankan hasilnya, seperti yang akan dibahas di episode 20.
Node.js versi 22 ke atas bisa menjalankan TypeScript tanpa transpiler:
node --experimental-strip-types src/server.tsBendera --experimental-strip-types membuat Node membuang sintaks tipe sebelum mengeksekusi. Karena hanya menghapus tipe tanpa transformasi, fitur runtime seperti enum dan namespace perlu penanganan khusus. Alat seperti tsx tetap paling fleksibel untuk berbagai proyek.
Dengan @types/node, seluruh API Node.js terketik:
bun add -d @types/nodeimport { readFile } from "node:fs/promises";
async function bacaConfig(path: string): Promise<string> {
return readFile(path, "utf-8");
}Paket @types/node memberi tipe untuk modul bawaan seperti fs, path, dan http. Impor dengan awalan node: memperjelas asal modul dan didukung penuh oleh deklarasi. Method seperti readFile sudah punya tipe return yang bisa di-andalkan.
process.env secara bawaan bertipe string | undefined longgar. Amankan dengan lapisan validasi:
function envWajib(nama: string): string {
const nilai = process.env[nama];
if (!nilai) {
throw new Error(`Variabel lingkungan ${nama} tidak diatur`);
}
return nilai;
}
const apiUrl = envWajib("API_URL");
const port = Number(envWajib("PORT"));Fungsi envWajib memaksa variabel ada atau melempar error saat startup. Error lebih baik terjadi cepat daripada aplikasi berjalan dengan konfigurasi salah. Mengonversi dengan Number juga memberi tipe number yang jelas untuk nilai numerik.
Tip
Jangan memanggil envWajib di dalam fungsi yang dipanggil berulang. Panggil sekali di level modul dan simpan hasilnya di konstanta. Kegagalan konfigurasi akan terdeteksi saat proses pertama kali dimuat.
Kode backend dipenuhi async. Pola yang aman wajib menangani penolakan promise:
type Hasil = { kode: number; data?: unknown };
async function panggilApi(): Promise<Hasil> {
try {
const respons = await fetch("https://api.contoh.id/data");
if (!respons.ok) {
throw new Error(`HTTP ${respons.status}`);
}
const data: unknown = await respons.json();
return { kode: respons.status, data };
} catch (err) {
console.error("Gagal memanggil API:", err);
return { kode: 500 };
}
}Fungsi panggilApi mengembalikan bentuk hasil yang seragam, sukses atau gagal. Nilai dari luar dideklarasikan unknown dan baru dipakai setelah validasi. Dengan tipe kembalian Promise<Hasil>, pemanggil tahu bentuk apa yang akan diterima dan bisa memprosesnya tanpa kejutan.
Episode 16 memindahkan kalian ke sisi server: menjalankan TypeScript dengan tsx atau type stripping Node.js, memasang @types/node, mengamankan process.env, dan menulis async yang menangani error secara eksplisit.
Inti yang harus dibawa pulang:
tsx menjalankan TypeScript tanpa build; mode watch memuat ulang otomatis.--experimental-strip-types.@types/node mengetikkan seluruh API bawaan Node.js.process.env perlu divalidasi sebelum dipakai.unknown memaksa validasi data dari luar sebelum dipakai.Di episode 17 selanjutnya kita akan membahas code generation, API types, dan contract-driven development, yaitu menurunkan tipe dari skema agar frontend dan backend selalu sinkron.