Lewati ke konten

Error Corner BAB 10

Setelah membaca halaman ini, kamu diharapkan dapat:

  • Mengidentifikasi penyebab error umum pada async/await dan module system.
  • Membaca pesan error compiler terkait path impor dan unhandled promise rejections.
  • Memperbaiki kesalahan syntax ekspor dan impor.

Kesalahan pada pemrograman Asynchronous sering memicu crash program saat dijalankan (runtime error), sedangkan kesalahan pada Module System langsung memicu error kompilasi karena file tidak dapat ditemukan atau nama komponen tidak cocok.


Error 1 — Lupa Menuliskan await pada Promise

Section titled “Error 1 — Lupa Menuliskan await pada Promise”
📄 TypeScript
async function main() {
const data = fetch("https://api.com/siswa");
// console.log(data.status); // Error!
// Property 'status' does not exist on type 'Promise<Response>'.
}

fetch() mengembalikan objek Promise, bukan data respon langsung. Jika kamu lupa menulis await, variabel data akan tetap bertipe Promise (dalam status pending) dan tidak memiliki properti .status.

📄 TypeScript
const response = await fetch("https://api.com/siswa"); // ✓ Tambahkan await
console.log(response.status);

Error 2 — Unhandled Promise Rejection (Lupa catch)

Section titled “Error 2 — Unhandled Promise Rejection (Lupa catch)”
📄 TypeScript
function ambilData() {
return Promise.reject("Koneksi Terputus!");
}
ambilData().then((hasil) => console.log(hasil));
// Jika gagal, program memicu crash dengan pesan:
// UnhandledPromiseRejectionWarning: Unhandled promise rejection.

Sebuah Promise yang dibatalkankan (reject) wajib ditangkap kegagalannya menggunakan .catch() atau try...catch agar Node.js tidak mengalami crash.

📄 TypeScript
ambilData()
.then((hasil) => console.log(hasil))
.catch((error) => console.log("Gagal:", error)); // ✓ Tangkap error

Error 3 — Salah Menuliskan Ekstensi .ts pada Path Impor

Section titled “Error 3 — Salah Menuliskan Ekstensi .ts pada Path Impor”
📄 TypeScript
import { Siswa } from "./siswa.ts"; // Error di TypeScript!
// An import path can only end with a '.ts' extension when 'allowImportingTsExtensions' is enabled.

TypeScript secara default melarang penulisan ekstensi .ts secara langsung pada jalur impor file karena proses kompilasi akan mengubahnya menjadi .js.

Cukup tulis nama filenya saja tanpa ekstensi:

📄 TypeScript
import { Siswa } from "./siswa"; // ✓

Error 4 — Tertukar antara Default dan Named Import

Section titled “Error 4 — Tertukar antara Default dan Named Import”
📄 siswa.ts
export default class Siswa {}
// File: main.ts (Salah memakai kurung kurawal)
import { Siswa } from "./siswa"; // Error!
// Module './siswa' has no exported member 'Siswa'. Did you mean to use 'import Siswa from "./siswa"'?

Default export diimpor tanpa kurung kurawal { }. Named export diimpor wajib menggunakan kurung kurawal { }.

📄 TypeScript
import Siswa from "./siswa"; // ✓ Tanpa kurung kurawal untuk default export

Error 5 — Akses Variabel Async Sebelum Callback Selesai

Section titled “Error 5 — Akses Variabel Async Sebelum Callback Selesai”
📄 TypeScript
let namaSiswa = "";
ambilNilaiSiswa(1001, (siswa) => {
namaSiswa = siswa.nama;
});
console.log(namaSiswa); // Output: "" (kosong!)

console.log di luar callback dijalankan secara synchronous (instan), sedangkan pengisian namaSiswa di dalam callback baru terjadi setelah 2 detik di latar belakang.

Pindahkan seluruh kode pemrosesan data hasil ke dalam blok callback:

📄 TypeScript
ambilNilaiSiswa(1001, (siswa) => {
const namaSiswa = siswa.nama;
console.log(namaSiswa); // ✓ Berhasil menampilkan data
});

  1. Gunakan console.log(typeof data): Cek apakah data yang kamu miliki sudah berwujud objek atau masih berwujud Promise (lupa await).
  2. Cek Bea Cukai BEA (Export/Import): Jika VS Code bertuliskan Cannot find module, periksa ejaan path file, pastikan file tujuan sudah memiliki keyword export, dan tidak menulis ekstensi .ts.

Perbaiki seluruh kesalahan dalam kode di bawah ini agar dapat dikompilasi tanpa error:

📄 TypeScript
// Tulis ulang kode di bawah ini dengan format import dan await yang benar:
// import { Siswa } from "./siswa-default.ts";
// async function main() {
// const data = fetch("https://jsonplaceholder.typicode.com/todos/1");
// console.log(data.title);
// }

  • Lupa await membuat variabel tetap berisi Promise pending.
  • Selalu gunakan .catch() atau try...catch pada Promise.
  • Impor file lokal dilarang menuliskan ekstensi .ts.
  • Default import tidak memakai { }, Named import wajib memakai { }.