Mini Project: Aplikasi Data Akademik
Tujuan Pembelajaran
Section titled “Tujuan Pembelajaran”Setelah mini project ini, kamu dapat menggabungkan Interface, Type Alias, Enum, Union, Array of Object, dan modular function untuk membangun program simulasi manajemen data sekolah.
Pendahuluan
Section titled “Pendahuluan”Kita akan membuat aplikasi Data Akademik Sekolah yang mengelola daftar siswa dan guru, menentukan kelulusan berdasarkan nilai rata-rata, memfilter data, dan mencetak laporan statistik. Project ini menggabungkan pilar dasar pemrograman (BAB 1–6) dengan teknik pemodelan data TypeScript (BAB 7).
Fitur Aplikasi
Section titled “Fitur Aplikasi”- Mengelompokkan data guru dan siswa
- Menyaring kelulusan secara otomatis menggunakan interface function
- Membatasi status kehadiran wali kelas menggunakan Enum
- Menangani input NIS fleksibel menggunakan Union Type
- Menampilkan visual laporan akademik terformat di terminal
Visual Architecture
Section titled “Visual Architecture”Enum StatusHadir { Hadir, Izin, Absen }type NIS = string | number (Union)
interface Orang { nama, umur } ├── extends Siswa { nis: NIS, nilai } └── extends Guru { nip, status: StatusHadir }
interface Kelas { namaKelas, waliKelas: Guru, siswa: Siswa[] }
Fungsi Laporan ──► memproses & memvalidasi data berdasarkan interfaceMari Mencoba
Section titled “Mari Mencoba”Buat src/bab7/aplikasi-akademik.ts:
// =====================================================// MINI PROJECT: APLIKASI DATA AKADEMIK// Menggabungkan BAB 1 s.d. BAB 7// =====================================================
// 1. Enum untuk Status Kehadiran Guruenum StatusHadir { Hadir = "HADIR", Izin = "IZIN", Absen = "ABSEN"}
// 2. Union Type untuk ID / NIS fleksibeltype IDAkademik = string | number;
// 3. Interface Struktur Orang (Induk)interface Orang { nama: string; umur: number;}
// 4. Interface Siswa & Guru (Anak)interface Siswa extends Orang { nis: IDAkademik; nilaiRataRata: number;}
interface Guru extends Orang { nip: number; mataPelajaran: string; status: StatusHadir; // menggunakan Enum}
// 5. Interface Rombel Kelasinterface Rombel { namaKelas: string; waliKelas: Guru; daftarSiswa: Siswa[];}
// ── Database Karyawan & Siswa ──────────────────────────const waliKelas: Guru = { nama: "Pak Budi Santoso", umur: 38, nip: 19870615, mataPelajaran: "TypeScript Programming", status: StatusHadir.Hadir}
const dataSiswa: Siswa[] = [ { nama: "Putra", umur: 17, nis: "NIS-1001", nilaiRataRata: 82 }, { nama: "Dewi", umur: 16, nis: 1002, nilaiRataRata: 70 }, // NIS berupa number { nama: "Citra", umur: 17, nis: "NIS-1003", nilaiRataRata: 95 }, { nama: "Budi", umur: 16, nis: 1004, nilaiRataRata: 60 } // NIS berupa number]
const kelasXIRPL1: Rombel = { namaKelas: "XI RPL 1", waliKelas, daftarSiswa: dataSiswa}
// ── Fungsi Analisis Kelulusan (Interface Function) ─────interface AnalisisKelas { (r: Rombel, batasLulus?: number): void;}
const cetakLaporanAkademik: AnalisisKelas = (kelas, batasLulus = 75) => { const { namaKelas, waliKelas, daftarSiswa } = kelas
// Hitung total & rata-rata kelas const totalNilai = daftarSiswa.reduce((acc, s) => acc + s.nilaiRataRata, 0) const rataRataKelas = totalNilai / daftarSiswa.length
// Filter siswa lulus & remedial const lulus = daftarSiswa.filter((s) => s.nilaiRataRata >= batasLulus) const remedial = daftarSiswa.filter((s) => s.nilaiRataRata < batasLulus)
console.log("=".repeat(55)) console.log(` LAPORAN AKADEMIK KELAS: ${namaKelas}`) console.log("=".repeat(55)) console.log(` Wali Kelas : ${waliKelas.nama}`) console.log(` Mata Pelajar. : ${waliKelas.mataPelajaran}`) console.log(` Status Wali : ${waliKelas.status}`) console.log("-".repeat(55)) console.log(` Rata-rata Kelas: ${rataRataKelas.toFixed(2)}`) console.log(` Batas Lulus : ${batasLulus}`) console.log("-".repeat(55))
console.log(" DAFTAR SISWA LULUS:") lulus.forEach((s) => { // Membaca tipe union NIS secara aman const nisTampil = typeof s.nis === "string" ? s.nis : `NUM-${s.nis}` console.log(` [${nisTampil.padEnd(8)}] ${s.nama.padEnd(8)}: ${s.nilaiRataRata} (LULUS)`) })
console.log("\n DAFTAR SISWA REMEDIAL:") remedial.forEach((s) => { const nisTampil = typeof s.nis === "string" ? s.nis : `NUM-${s.nis}` console.log(` [${nisTampil.padEnd(8)}] ${s.nama.padEnd(8)}: ${s.nilaiRataRata} (REMEDIAL)`) })
console.log("=".repeat(55))}
// Jalankan laporan dengan batas lulus default (75)cetakLaporanAkademik(kelasXIRPL1)
// Jalankan laporan dengan batas lulus kustom (70)console.log("\nSimulasi batas lulus diturunkan menjadi 70:")cetakLaporanAkademik(kelasXIRPL1, 70)Jalankan:
tsx src/bab7/aplikasi-akademik.tsOutput (sebagian)
Section titled “Output (sebagian)”======================================================= LAPORAN AKADEMIK KELAS: XI RPL 1======================================================= Wali Kelas : Pak Budi Santoso Mata Pelajar. : TypeScript Programming Status Wali : HADIR---
---------------------------------------------------- Rata-rata Kelas: 76.75 Batas Lulus : 75---
---------------------------------------------------- DAFTAR SISWA LULUS: [NIS-1001] Putra : 82 (LULUS) [NIS-1003] Citra : 95 (LULUS)
DAFTAR SISWA REMEDIAL: [NUM-1002] Dewi : 70 (REMEDIAL) [NUM-1004] Budi : 60 (REMEDIAL)=======================================================Penjelasan Bagian Penting
Section titled “Penjelasan Bagian Penting”Enum Kehadiran
Section titled “Enum Kehadiran”enum StatusHadir { Hadir = "HADIR", ... }Membatasi status wali kelas agar hanya bisa bernilai “HADIR”, “IZIN”, atau “ABSEN” (tidak boleh string acak).
Union Type ID/NIS
Section titled “Union Type ID/NIS”type IDAkademik = string | number;Daftar siswa memiliki NIS berbentuk string ("NIS-1001") dan number (1002). TypeScript meloloskan keduanya karena mematuhi tipe gabungan IDAkademik.
Type Guarding Union
Section titled “Type Guarding Union”const nisTampil = typeof s.nis === "string" ? s.nis : `NUM-${s.nis}`Saat menampilkan data, program memeriksa tipe data s.nis. Jika string, tampilkan langsung. Jika number, tambahkan prefix "NUM-". Ini membuat program aman dari bug tipe.
Interface Function
Section titled “Interface Function”interface AnalisisKelas { (r: Rombel, batasLulus?: number): void;}Interface menetapkan aturan function cetakLaporanAkademik: parameter ke-1 wajib Rombel, parameter ke-2 opsional number.
Latihan
Section titled “Latihan”Kembangkan mini project ini:
- Ubah status kehadiran wali kelas menjadi
StatusHadir.Izindan lihat perubahannya di laporan. - Tambahkan satu siswa baru dengan NIS berupa string
"NIS-1005"dan nilai68, lalu jalankan ulang simulasi laporan.
Ringkasan
Section titled “Ringkasan”- Interface, Type Alias, Enum, dan Union bekerja sama mendesain data sekolah yang kompleks.
- Enum menjaga keandalan string opsi.
- Type Guarding (
typeof) wajib digunakan untuk memproses properti bertipe union. - Laporan terminal yang teratur mempermudah visualisasi data bagi user.