Cheat Sheet: Jebakan Frustasi TypeScript

I am an enthusiastic researcher and developer with a passion for using technology to innovate in business and education.
Search for a command to run...

I am an enthusiastic researcher and developer with a passion for using technology to innovate in business and education.
No comments yet. Be the first to comment.
Ringkasan: Jika OpenClaw adalah AI Operating System yang menghubungkan berbagai layanan dan agent, maka Hermes adalah AI Worker yang fokus mengerjakan pekerjaan, belajar dari pengalaman, dan semakin p

Ketika membangun aplikasi modern seperti Next.js, Cloudflare Workers, platform AI, microservices, atau real-time dashboard, ada banyak istilah jaringan yang sering muncul: TCP, UDP, HTTP/2, QUIC, WebS

Setiap tahun, ribuan mahasiswa jurusan Teknologi Informasi, Sistem Informasi, dan Teknik Informatika diwisuda. Namun, tidak sedikit di antara mereka yang kemudian menghadapi kenyataan yang cukup berat

Jika Anda menggunakan Next.js, kemungkinan besar Anda pernah mendengar anggapan bahwa: "Next.js = Vercel" Padahal kenyataannya tidak harus demikian. Di sinilah OpenNext hadir. OpenNext adalah proyek

Saat pertama kali mencoba OpenCode Go, saya hampir langsung berlangganan tanpa membaca detail program yang mereka sediakan. Untungnya saya menemukan bahwa OpenCode memiliki program referral yang membe

TypeScript memang powerful, tapi ada beberapa "jebakan" yang bisa bikin frustasi. Berikut daftarnya beserta solusinya:
Masalah: TypeScript kadang infer tipe yang tidak diharapkan.
const arr = [1, 2, "3"]; // inferred as (number | string)[]
Solusi: Gunakan type annotation eksplisit.
const arr: number[] = [1, 2, 3]; // Error jika ada string
any yang Diam-diam MenyusupMasalah: any menghilangkan type safety.
let data: any = "Hello";
data = 42; // No error, tapi bahaya!
Solusi: Hindari any, gunakan unknown atau type yang lebih spesifik.
let data: unknown = "Hello";
if (typeof data === "string") {
console.log(data.toUpperCase()); // Safe
}
Masalah: Bingung antara ?, null, dan undefined.
interface User {
name?: string; // Optional property
}
const user: User = {};
console.log(user.name?.toUpperCase()); // OK
console.log(user.name.toUpperCase()); // Error: mungkin undefined
Solusi: Pahami perbedaannya:
? = Properti opsional (bisa undefined).
null = Nilai eksplisit null.
undefined = Tidak ada nilai.
Masalah: TypeScript tidak selalu menyempitkan tipe dengan benar.
function isString(x: any): x is string {
return typeof x === "string";
}
let value: string | number = "Hello";
if (isString(value)) {
console.log(value.toUpperCase()); // OK
} else {
console.log(value.toFixed(2)); // Error: mungkin string
}
Solusi: Gunakan type guards yang lebih eksplisit (typeof, instanceof, dll).
readonly yang Tidak Sepenuhnya ImmutableMasalah: readonly hanya berlaku di level terluar.
interface Config {
readonly apiUrl: string;
readonly endpoints: string[];
}
const config: Config = { apiUrl: "...", endpoints: ["/a", "/b"] };
config.endpoints.push("/c"); // Tidak error!
Solusi: Gunakan ReadonlyArray atau DeepReadonly (dengan utility type/library).
interface Config {
readonly apiUrl: string;
readonly endpoints: ReadonlyArray<string>;
}
Masalah: Overload signature bisa rumit.
function greet(name: string): string;
function greet(age: number): string;
function greet(value: any): string {
return typeof value === "string" ? `Hello, ${value}` : `Age: ${value}`;
}
Solusi: Gunakan union types jika memungkinkan.
function greet(value: string | number): string {
return typeof value === "string" ? `Hello, ${value}` : `Age: ${value}`;
}
this Context yang HilangMasalah: this bisa berubah di callback.
class Button {
onClick() {
console.log("Clicked!");
}
addListener() {
document.addEventListener("click", this.onClick); // `this` bukan instance Button!
}
}
Solusi: Gunakan arrow function atau .bind(this).
class Button {
onClick = () => {
console.log("Clicked!");
};
addListener() {
document.addEventListener("click", this.onClick); // Works!
}
}
Masalah: Generics bisa bikin kode sulit dibaca.
function merge<T, U>(a: T, b: U): T & U {
return { ...a, ...b };
}
Solusi: Gunakan default type atau batasi dengan constraints.
function merge<T extends object, U extends object>(a: T, b: U): T & U {
return { ...a, ...b };
}
Masalah: Import bisa error karena moduleResolution tidak sesuai.
// Error jika `moduleResolution: "node"` dan file tidak ada
import { something } from "./file.ts";
Solusi: Pahami konfigurasi tsconfig.json ("node", "classic", dll).
Masalah: strictNullChecks bisa bikin banyak error.
let name: string;
name = null; // Error jika `strictNullChecks: true`
Solusi: Gunakan union type (string | null) atau optional chaining (?.).
Selalu aktifkan strict: true di tsconfig.json.
Hindari any, gunakan unknown atau type yang lebih spesifik.
Pahami perbedaan null, undefined, dan optional properties.
Gunakan type guards untuk narrowing.
Hati-hati dengan mutability (readonly, const, ReadonlyArray).
Semoga cheat sheet ini membantu menghindari jebakan TypeScript! 🚀