Interface — TypeScript

Interface mendefinisikan kontrak bentuk object yang bisa dipakai ulang: interface User { nama: string; umur: number; email?: string; // opsional } const budi…

Interface memberi nama pada sebuah bentuk object, supaya bentuk itu bisa dipakai ulang di banyak tempat. Di materi sebelumnya bentuk object ditulis langsung di samping variabel. Interface menuliskannya sekali, dengan nama seperti User. Mirip template formulir yang disimpan dengan nama "Formulir Anggota": daripada menggambar kolomnya ulang di tiap halaman, cukup sebut namanya. Formulir Admin tinggal "Formulir Anggota ditambah kolom jabatan".

🧪 Tebakan cepat: interface Admin extends User cuma menulis satu property, role. Object Admin { nama: "Rina", role: "editor" } gak punya umur. Diterima atau ditolak? Tebak dulu, jawabannya ada di bagian "extends: interface turunan".

Memberi nama pada bentuk object

interface User {
  nama: string;
  umur: number;
}

const budi: User = { nama: "Budi", umur: 17 };
const ani: User = { nama: "Ani", umur: 20 };

Interface sebagai type parameter

function formatUser(user: User): string {
  return user.nama + " (" + user.umur + ")";
}

console.log(formatUser(budi));                     // Budi (17)
console.log(formatUser({ nama: "Ani", umur: 20 })); // Ani (20)

Interface cuma untuk TypeScript. Di JavaScript hasil compile, interface User hilang total, gak tersisa satu baris pun:

"use strict";
function formatUser(user) {
    return user.nama + " (" + user.umur + ")";
}

Latihan juga menerima type User = { nama: string; umur: number };. Bedanya dengan interface dibahas di materi berikutnya, Type Alias.

Property opsional di interface

interface User {
  nama: string;
  umur: number;
  email?: string;
}

Sama seperti di object type, ? membuat email boleh gak ada. Tanpa email?, object yang punya email ditolak: Object literal may only specify known properties, and 'email' does not exist in type 'User'. ts(2353).

extends: interface turunan

interface Admin extends User {
  role: string;
}

const sari: Admin = { nama: "Sari", umur: 25, role: "editor" };
console.log(formatUser(sari)); // Sari (25)

const rina: Admin = { nama: "Rina", role: "editor" };

📌 Interface dengan nama sama digabung

interface User {
  nama: string;
}
interface User {
  umur: number;
}

const budi: User = { nama: "Budi" };

Dua interface bernama sama gak bikin error. TypeScript menggabungkannya jadi satu User berisi nama dan umur (declaration merging), jadi budi ditolak karena gak punya umur. Fitur ini dipakai library untuk menambah property ke interface yang sudah ada. Di kodemu sendiri, nama yang gak sengaja kembar bisa bikin bingung, jadi pakai nama yang beda.

⚠️ Jebakan yang sering ketemu

TL;DR: interface User { nama: string; umur: number; } memberi nama pada bentuk object, dengan huruf kapital di depan. Pakai seperti type lain: const budi: User, function formatUser(user: User): string. email?: string membuat property opsional. interface Admin extends User { role: string; } mewarisi semua property User dan menambah role, dan property warisan tetap wajib. Dua interface bernama sama digabung. Interface hilang total di JavaScript hasil compile.

Yang akan kamu pelajari