Catatan Belajar · · 3 menit baca
Belajar TypeScript: dari instalasi sampai generics
Tutorial TypeScript gaya mentoring: instalasi + tsconfig yang benar, tipe dasar yang menutup 90% kebutuhan, generics dengan contoh nyata dari situs ini, dan migrasi bertahap dari JavaScript.
TypeScript adalah JavaScript + sistem tipe. Sekali terbiasa, rasanya seperti punya reviewer yang memeriksa kodemu sebelum dijalankan. Tutorial ini jalur yang kupakai sendiri — dari instalasi sampai pola yang benar-benar terpakai di project (termasuk situs ini, yang 100% TypeScript).
1. Instalasi
Prasyarat: Node.js 20+. Lalu:
npm install -D typescript
npx tsc --init # membuat tsconfig.json
Konfigurasi minimum yang kusarankan untuk project baru:
// tsconfig.json
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true, // nyalakan dari hari pertama — ini intinya TS
"noEmit": true // biarkan bundler (Vite/esbuild) yang transpile
},
"include": ["src"]
}
Cek tipe kapan pun dengan npx tsc --noEmit — di project-ku ini selalu jadi script npm run typecheck.
2. Tipe dasar yang menutup 90% kebutuhan
// Anotasi eksplisit hanya saat TS tidak bisa menebak
let nama: string = "Alif"; // ❌ berlebihan — TS sudah tahu dari nilainya
let nama2 = "Alif"; // ✅ inference bekerja
// Interface untuk bentuk objek
interface Produk {
id: number;
nama: string;
harga: number;
diskon?: number; // opsional
}
// Union type — nilai yang hanya boleh salah satu
type Status = "draft" | "published";
function publikasikan(p: Produk, status: Status) {
if (status === "published") { /* TS tahu status pasti "published" di sini */ }
}
3. Generics — sekali paham, ketagihan
Generics = fungsi/tipe yang “menunda” keputusan tipenya ke pemanggil:
function pertama<T>(arr: T[]): T | undefined {
return arr[0];
}
const p = pertama([{ id: 1, nama: "Kopi", harga: 25000 }]);
// p bertipe Produk | undefined — tanpa cast, tanpa any
Contoh nyata dari situs ini — resolver dictionary i18n yang mengubah node terjemahan jadi string tapi mempertahankan bentuk objeknya:
type Resolved<T> = T extends { nodeType: string } ? string
: T extends readonly (infer U)[] ? Resolved<U>[]
: T extends object ? { [K in keyof T]: Resolved<T[K]> } : T;
4. Migrasi bertahap dari JavaScript
Tidak perlu rewrite. Di tsconfig.json set "allowJs": true, ganti file per file dari .js ke .ts, dan perbaiki error yang muncul. Prioritaskan file yang paling sering berubah — di situlah tipe paling banyak menyelamatkanmu.
Tips dari pengalaman
strict: truetidak bisa ditawar. TS tanpa strict cuma JS dengan langkah build ekstra.- Hindari
any; pakaiunknown.unknownmemaksamu mengecek dulu sebelum memakai —anymematikan seluruh manfaat TS. - Biarkan inference bekerja. Anotasi berlebihan bikin kode berisik; anotasikan parameter fungsi dan nilai balik API publik, sisanya biarkan TS menebak.
- Tipe adalah dokumentasi yang tidak pernah basi — interface
Produkdi atas menjelaskan dirinya sendiri ke developer berikutnya.
Mau fitur seperti ini dibangun untuk bisnismu?