Belajar TypeScript - TypeScript di Backend Node.js
Episode 16 of 23

Belajar TypeScript - TypeScript di Backend Node.js

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.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

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.

Menjalankan TypeScript di Node.js

Menggunakan tsx

tsx adalah runner paling sederhana untuk TypeScript:

Jalankan TypeScript dengan tsx
bun add -d tsx
bunx tsx src/server.ts

Perintah 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:

Watch mode
bunx tsx watch src/server.ts

Mode 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.

Type Stripping Bawaan Node.js

Node.js versi 22 ke atas bisa menjalankan TypeScript tanpa transpiler:

Jalankan dengan type stripping
node --experimental-strip-types src/server.ts

Bendera --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.

Tipe untuk Node.js

Dengan @types/node, seluruh API Node.js terketik:

Pasang tipe Node
bun add -d @types/node
Memakai tipe Node
import { 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.

Environment Variables yang Aman

process.env secara bawaan bertipe string | undefined longgar. Amankan dengan lapisan validasi:

Validasi process.env
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.

Async dan Penanganan Error

Kode backend dipenuhi async. Pola yang aman wajib menangani penolakan promise:

Async dengan penanganan error
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.

Penutup

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.
  • Node.js baru mendukung type stripping dengan --experimental-strip-types.
  • @types/node mengetikkan seluruh API bawaan Node.js.
  • process.env perlu divalidasi sebelum dipakai.
  • Gagal cepat saat startup lebih baik daripada konfigurasi salah di produksi.
  • Kembalian 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.

Belajar TypeScript - TypeScript di Backend Node.js | Belajar TypeScript