
WDELogbook entry
Cara Menulis Variabel di TypeScript yang Benar dan Rapi
Pelajari cara menulis variabel di TypeScript secara lengkap mulai dari anotasi tipe data, inferensi otomatis, hingga penerapan objek dan immutabilitas.
Departures

WDELogbook entry
Pelajari cara menulis variabel di TypeScript secara lengkap mulai dari anotasi tipe data, inferensi otomatis, hingga penerapan objek dan immutabilitas.
Cara menulis variabel di TypeScript berfokus pada pemberian tipe data yang jelas lewat kata kunci let dan const agar kode bebas dari bug saat kompilasi. Sistem static typing TypeScript memeriksa setiap deklarasi variabel sebelum program dieksekusi oleh runtime JavaScript. Penerapan aturan tipe data yang tepat membuat struktur data aplikasi tetap konsisten selama masa pengembangan.
Sintaks dasar penulisan variabel di TypeScript menggunakan format kata kunci, nama variabel, tanda titik dua, tipe data, serta nilai awal. Pola penulisan ini memberi tahu TypeScript compiler mengenai bentuk data yang diizinkan untuk disimpan ke dalam variabel terkait.
Bentuk umum penulisan variabel memakai anotasi tipe eksplisit dapat dilihat pada contoh berikut:
Struktur penulisan tersebut memiliki empat komponen utama yang bekerja secara terpadu:
Pengecekan tipe data berjalan saat proses kompilasi berlangsung di komputer lokal. Kode JavaScript hasil transpilasi nantinya tidak lagi memuat anotasi tipe data karena runtime Node.js atau browser hanya membaca nilai JavaScript murni.
Tabel perbandingan karakteristik deklarasi variabel berikut menunjukkan batasan teknis masing-masing opsi:
Variabel maxRetryAttempts tidak dapat ditugaskan ulang dengan nilai lain sepanjang runtime. Apabila developer memaksakan perubahan nilai pada variabel konstanta, compiler TypeScript langsung menghentikan proses build aplikasi.
Penulisan variabel primitif di TypeScript mencakup tujuh tipe data dasar bawaan, yaitu string, number, boolean, null, undefined, bigint, dan symbol. Tipe data primitif merepresentasikan nilai tunggal yang bersifat immutable pada tingkat memori terendah.
Berikut merupakan contoh penerapan tipe data primitif yang sering digunakan dalam pengembangan aplikasi harian:
Programmer disarankan mengandalkan type inference saat variabel langsung diinisialisasi dengan nilai awal yang jelas, dan menggunakan type annotation eksplisit saat tipe data variabel bersifat kompleks atau belum memiliki nilai awal. Type inference adalah kemampuan cerdas compiler TypeScript dalam menebak tipe data secara otomatis berdasarkan nilai yang diberikan.
Perhatikan contoh penulisan menggunakan inferensi tipe otomatis berikut:
Situasi yang mewajibkan penulisan type annotation secara eksplisit meliputi langkah berikut:
Contoh deklarasi variabel tertunda yang memerlukan anotasi manual:
Sintaks array reguler menampung kumpulan elemen dengan tipe data yang seragam tanpa membatasi jumlah elemen di dalamnya:
Tuple digunakan saat urutan dan jumlah elemen di dalam array harus memiliki panjang serta tipe data yang kaku. Struktur tuple sangat berguna untuk koordinat geospasial, pasangan kunci-nilai, atau status respon sistem:
Penerapan tuple readonly menjamin struktur data tetap utuh sepanjang siklus eksekusi aplikasi web Anda.
Contoh penulisan model objek menggunakan deklarasi interface:
Alternatif lain adalah menggunakan type alias yang mendukung pembuatan struktur data lebih fleksibel, termasuk tipe data primitif gabungan:
Tabel perbandingan berikut merangkum perbedaan implementasi variabel objek antara Interface dan Type Alias:
Variabel dengan union types dideklarasikan menggunakan simbol pipa tegak vertikal untuk mengizinkan penyimpanan nilai dari beberapa pilihan tipe data yang telah ditentukan sebelumnya. Literal types mempersempit cakupan tipe data sehingga variabel hanya menerima nilai teks atau angka spesifik tertentu.
Penggabungan kedua teknik ini menghasilkan sistem validasi variabel yang sangat ketat pada tingkat kode sumber:
Literal types mengeliminasi kebutuhan penggunaan string acak yang rawan kesalahan pengetikan di berbagai tempat dalam kode aplikasi. Anda juga dapat menggunakan numeric literal types untuk mendefinisikan batasan angka spesifik:
Saat memproses variabel bertipe union, manfaatkan teknik type narrowing menggunakan operator JavaScript asli seperti typeof untuk memastikan tipe data aktual sebelum menjalankan operasi logika:
TypeScript compiler akan membaca blok percabangan tersebut secara cerdas dan memperlakukan variabel data sebagai tipe spesifik di dalam masing-masing kurung kurawal.
Perhatikan bahaya penggunaan any pada cuplikan kode berikut:
Bandingkan deklarasi objek biasa dengan objek yang diberi modifier as const berikut:
Klausa as const juga sangat bermanfaat ketika Anda ingin membuat tipe turunan dari kumpulan nilai array tetap tanpa menulis ulang daftarnya:
Langkah ini menjaga konsistensi data konfigurasi sistem Anda dan menghemat waktu refactoring kode di masa mendatang.
Scope atau cakupan variabel di TypeScript menentukan di area mana suatu variabel dapat diakses dan berapa lama variabel tersebut bertahan di dalam memori eksekusi. TypeScript menganut tiga level cakupan utama, yaitu block scope, function scope, dan global scope.
Variabel di dalam blok memiliki siklus hidup yang disebut Temporal Dead Zone (TDZ). TDZ adalah rentang waktu antara masuknya alur program ke dalam blok scope sampai deklarasi variabel dieksekusi oleh mesin JavaScript. Mengakses variabel sebelum baris inisialisasinya akan menghasilkan error seketika:
Untuk mendeklarasikan variabel yang berasal dari luar berkas TypeScript, seperti objek global browser atau script pihak ketiga yang disematkan langsung di HTML, gunakan deklarasi ambien declare:
Deklarasi ambien tidak menghasilkan baris kode kompilasi apapun ke berkas JavaScript, melainkan hanya bertindak sebagai petunjuk tipe bagi editor kode dan compiler.
Error variabel di TypeScript compiler diatasi dengan memeriksa kesesuaian tipe data, menginisialisasi nilai variabel sebelum diakses, serta mengatur konfigurasi compiler secara tepat. TypeScript menyediakan pesan error dengan kode angka unik untuk memudahkan pelacakan sumber anomali kode.
Berikut merupakan tiga error variabel yang paling sering dihadapi oleh developer beserta langkah solusinya:
Error ini terjadi saat nilai yang dimasukkan ke dalam variabel tidak cocok dengan tipe data yang telah ditentukan pada deklarasi variabel.
Compiler memunculkan error ini saat variabel lokal dibaca nilainya padahal belum ada penugasan nilai awal di jalur eksekusi tersebut.
Pemahaman terhadap penanganan pesan error compiler ini sangat krusial saat menangani framework modern, seperti menangani bug routing pada How to Fix "params should be awaited" Error in Next.js 15+ yang membutuhkan akurasi tipe asynchronous.
Konvensi penamaan variabel TypeScript standar industri menggunakan aturan camelCase untuk variabel lokal dan fungsi, UPPER_SNAKE_CASE untuk konstanta global tak bergerak, serta PascalCase untuk tipe data, interface, dan enum. Mengikuti kaidah penamaan yang seragam mempermudah kolaborasi tim programmer dalam proyek berskala besar.
Daftar standar penamaan variabel yang menjadi pedoman resmi komunitas pengembang mencakup:
Contoh penerapan konvensi penamaan yang bersih dan mudah dibaca:
You must be logged in to comment
No comments yet. Be the first to comment!

Written by
Liu PurnomoI'm a Software Engineer who turns coffee into code, and sometimes I even make interactive web things that work! ☕💻 I'm also a certified multitasker: an Expert Drone Pilot (ask me for aerial selfies!), a Certified Instructor/Public Speaker (I talk a lot), and a Seasonal Runner who believes in running only when the weather is perfect. Let's connect!
More articles headed the same way as this one.
Banyak developer yang beralih dari ekosistem JavaScript dan Dominasi Web Modern mengalami kebingungan saat menentukan kapan harus menuliskan tipe data secara manual atau membiarkan compiler bekerja otomatis. Praktik penulisan yang rapi menentukan kemudahan membaca kode dalam jangka panjang, terutama pada arsitektur perangkat lunak skala besar. Pembahasan berikut mengupas tuntas teknik deklarasi variabel dari tingkat dasar hingga tingkat mahir sesuai standar ECMAScript 2026 dan TypeScript versi 5 ke atas.
1const appVersion: string = "2.4.0";2let activeUsers: number = 150;3let isMaintenanceMode: boolean = false;let atau const.TypeScript akan langsung menampilkan pesan error saat Anda mencoba memasukkan tipe data yang berbeda ke dalam variabel tersebut. Contohnya, baris kode activeUsers = "banyak" akan memicu error TS2322 karena tipe string tidak kompatibel dengan tipe number.
1let flightSpeed: number = 45;2// flightSpeed = "cepat"; // Error: Type 'string' is not assignable to type 'number'.Perbedaan utama const, let, dan var terletak pada aturan penetapan ulang nilai serta cakupan wilayah akses variabel dalam blok kode. TypeScript mewarisi ketiga kata kunci ini dari standar JavaScript modern dengan pengawasan tipe data yang jauh lebih ketat.
Kata kunci const digunakan untuk variabel bernilai tetap yang tidak boleh diubah referensinya setelah inisialisasi awal. Kata kunci let digunakan ketika nilai variabel perlu diperbarui di tengah alur program. Kata kunci var merupakan peninggalan versi JavaScript lama yang sebaiknya dihindari karena menganut sistem function scope dan memicu fenomena hoisting liar.
| Fitur Karakteristik | `const` | `let` | `var` |
|---|---|---|---|
| Reassignment Nilai | Tidak Diizinkan | Diizinkan | Diizinkan |
| Re-declaration Variabel | Ditolak Compiler | Ditolak Compiler | Diizinkan |
| Tingkat Scope | Block Scope {} | Block Scope {} | Function Scope |
| Hoisting Status | Temporal Dead Zone | Temporal Dead Zone | Diangkat bernilai undefined |
| Kebutuhan Inisialisasi | Wajib Diisi Langsung | Opsional | Opsional |
Penggunaan const menjamin keamanan kode karena mencegah perubahan data yang tidak disengaja. Contoh implementasi const dan let pada alur komputasi data:
1const maxRetryAttempts: number = 3;2let currentAttempt: number = 1;34while (currentAttempt <= maxRetryAttempts) {5 console.log(`Menjalankan percobaan ke-${currentAttempt}`);6 currentAttempt += 1;7}Dalam proyek backend modern seperti Setup awal Nextjs 16 dan Prisma 7, sekitar sembilan puluh persen variabel sebaiknya ditulis menggunakan const. Anda hanya perlu beralih ke let ketika nilai variabel memang ditakdirkan untuk dimutasi, misalnya pada penghitung perulangan atau penampung nilai akumulasi.
1// Tipe String untuk data teks2const droneBrand: string = "DJI";3const firmwareVersion: string = `v3.0.1-${droneBrand}`;45// Tipe Number untuk bilangan bulat dan pecahan6const batteryPercentage: number = 98.5;7const motorCount: number = 4;8const altitudeLimit: number = 120;910// Tipe Boolean untuk nilai logika benar atau salah11const isGpsLocked: boolean = true;12const hasPayloadAttached: boolean = false;1314// Tipe BigInt untuk angka berukuran sangat besar melampaui batas aman Number15const globalLogIdentifier: bigint = 9007199254740995n;1617// Tipe Symbol untuk identifier unik yang tidak dapat diduplikasi18const internalDeviceId: symbol = Symbol("drone_serial");Tipe data number di TypeScript mencakup bilangan bulat, desimal, heksadesimal, biner, maupun nilai khusus seperti NaN dan Infinity. Anda tidak perlu memisahkan tipe integer dan float seperti pada bahasa C++ atau Rust.
Penanganan nilai kosong menggunakan tipe data null dan undefined memerlukan perhatian khusus pada konfigurasi compiler. Variabel bernilai null menandakan ketiadaan nilai objek secara sengaja, sementara undefined menunjukkan bahwa variabel telah dideklarasikan namun belum diberi nilai apapun.
1let inspectionNotes: string | null = null;2let inspectionTimestamp: number | undefined = undefined;34inspectionNotes = "Area survei bebas rintangan vegetasi tinggi.";5inspectionTimestamp = Date.now();Aktifkan selalu opsi strictNullChecks di dalam file tsconfig.json proyek Anda. Pengaturan ini mencegah bug runtime karena TypeScript akan menolak penggunaan variabel bernilai null tanpa validasi kondisi terlebih dahulu.
1// Compiler otomatis menetapkan tipe string pada variabel operatorName2let operatorName = "Budi Santoso";34// Compiler otomatis menetapkan tipe number pada variabel flightDurationMinutes5let flightDurationMinutes = 45;Kode di atas menghasilkan keamanan tipe data yang sama persis dengan penulisan eksplisit let operatorName: string = "Budi Santoso". Menuliskan tipe data secara berulang pada deklarasi sederhana hanya memperpanjang baris kode tanpa memberi manfaat fungsional tambahan.
any implisit yang berisiko meloloskan bug ke tahap produksi.1// Wajib menggunakan anotasi tipe agar variabel tidak berubah menjadi any2let targetCoordinates: string;34if (process.env.REGION === "WEST") {5 targetCoordinates = "-6.2088,106.8456";6} else {7 targetCoordinates = "-7.2575,112.7521";8}Penggunaan alat bantu kecerdasan buatan dalam menulis kode sering kali menghasilkan anotasi tipe berlebihan yang mengurangi keterbacaan file kerja. Keseimbangan antara inferensi dan anotasi manual menjaga kerapian arsitektur kode tim pengembang, topik yang sering dibahas saat mengevaluasi Ketika AI coding assistant Menggerus Kemampuan Pemrograman di lingkungan rekayasa perangkat lunak modern.
Variabel array ditulis menggunakan sintaks kurung siku T[] atau bentuk generik Array<T>, sedangkan tuple ditulis menggunakan kurung siku berisi daftar tipe tetap [TypeA, TypeB]. Keduanya memiliki kegunaan yang berbeda untuk menyimpan kumpulan data terstruktur.
1// Format kurung siku standar2const telemetryChannels: string[] = ["Ch1", "Ch2", "Ch3"];34// Format generik alternatif5const signalFrequencies: Array<number> = [2.4, 5.8];67// Array yang menampung objek data kompleks8const flightAltitudes: number[] = [50, 100, 150, 200];9flightAltitudes.push(250); // Operasi valid1// Tuple koordinat: [latitude, longitude, altitude]2let droneWaypoint: [number, number, number];3droneWaypoint = [-6.1754, 106.8272, 120];45// Tuple status sistem: [status code, status message, isOperational]6const systemHealth: [number, string, boolean] = [200, "All sensors online", true];Untuk menjaga keamanan data dari modifikasi liar metode mutasi array seperti push() atau splice(), gunakan pengubah readonly pada variabel array dan tuple:
1const fixedFrequencies: readonly number[] = [2400, 5800];2// fixedFrequencies.push(900); // Error: Property 'push' does not exist on type 'readonly number[]'.34const frozenLocation: readonly [number, number] = [-6.2, 106.8];5// frozenLocation[0] = -6.3; // Error: Cannot assign to '0' because it is a read-only property.Penulisan variabel objek di TypeScript dilakukan dengan mendefinisikan bentuk kontrak data terlebih dahulu melalui interface atau type alias sebelum variabel diisi dengan data konkret. Langkah ini memastikan bahwa setiap properti yang dimiliki oleh objek memiliki tipe data yang valid dan terstruktur rapi.
1interface RemotePilotProfile {2 readonly licenseId: string;3 fullName: string;4 certificationYear: number;5 contactEmail?: string; // Properti opsional6}78const activePilot: RemotePilotProfile = {9 licenseId: "RPC-ID-2026-881",10 fullName: "Andi Pratama",11 certificationYear: 2026,12};Tanda tanya pada properti contactEmail menandakan bahwa properti tersebut bersifat opsional, sehingga compiler tidak mewajibkan keberadaannya saat inisialisasi variabel objek. Modifikator readonly pada licenseId mencegah pengubahan nilai properti setelah objek terbentuk.
1type BatteryTelemetry = {2 voltage: number;3 currentDraw: number;4 temperatureCelsius: number;5};67const currentBatteryState: BatteryTelemetry = {8 voltage: 22.8,9 currentDraw: 14.2,10 temperatureCelsius: 38.5,11};| Aspek Pemilihan | Interface | Type Alias |
|---|---|---|
| Tujuan Utama | Mendefinisikan kontrak bentuk objek | Mendefinisikan alias tipe data apapun |
| Fitur Declaration Merging | Didukung otomatis bila nama sama | Ditolak oleh compiler |
| Penggunaan Union & Primitive | Tidak dapat digunakan | Didukung penuh |
| Ekstensi Struktur | Menggunakan sintaks extends | Menggunakan intersection & |
Pilihlah interface saat membangun arsitektur objek berorientasi objek standar, dan gunakan type alias jika Anda membutuhkan fitur union types atau operasi pemetaan tipe tingkat lanjut.
1// Variabel union primitif2let sensorOutput: string | number;3sensorOutput = "1024 hPa";4sensorOutput = 1024;56// Variabel dengan string literal types7type FlightMode = "MANUAL" | "ATTITUDE" | "GPS_ASSIST" | "RETURN_TO_HOME";8let currentFlightMode: FlightMode = "GPS_ASSIST";910// Nilai di luar daftar akan ditolak seketika oleh compiler11// currentFlightMode = "SPORT"; // Error: Type '"SPORT"' is not assignable to type 'FlightMode'.1type AllowedBaudRate = 9600 | 19200 | 57600 | 115200;2const connectionSpeed: AllowedBaudRate = 115200;1function processSensorData(data: string | number) {2 if (typeof data === "string") {3 console.log(`Format data teks: ${data.toUpperCase()}`);4 } else {5 console.log(`Format data numerik: ${data.toFixed(2)}`);6 }7}Penggunaan tipe data any harus dihindari karena menonaktifkan seluruh mekanisme perlindungan tipe pada compiler TypeScript, sementara tipe unknown menyediakan fleksibilitas penampungan data tanpa mengorbankan keselamatan type checking. Tipe unknown memaksa developer melakukan verifikasi tipe data sebelum memanggil metode atau properti di dalam variabel terkait.
1let rawApiPayload: any = JSON.parse('{"status": "error"}');2// Baris ini lolos kompilasi namun memicu crash fatal saat runtime aplikasi berjalan3rawApiPayload.nonExistentMethod(); Tipe any membuat TypeScript berperilaku layaknya JavaScript dinamis biasa tanpa pengecekan keamanan. Masalah ini dapat diatasi secara elegan dengan mengganti tipe variabel menjadi unknown:
1let safeApiPayload: unknown = JSON.parse('{"status": "success", "code": 200}');23// safeApiPayload.code; // Error: 'safeApiPayload' is of type 'unknown'.45// Wajib melakukan pengecekan tipe data sebelum menggunakan nilainya6if (7 typeof safeApiPayload === "object" &&8 safeApiPayload !== null &&9 "status" in safeApiPayload10) {11 console.log("Payload berhasil diverifikasi secara aman.");12}Tipe data unknown adalah representasi tipe aman untuk data yang bentuknya belum diketahui saat waktu kompilasi, seperti respon jaringan atau input dari pengguna. Pendekatan defensif ini sangat penting untuk mencegah kerentanan sistem, sebagaimana prinsip keamanan yang sering dibahas saat mengonfigurasi Perbandingan Manajer Paket JavaScript npm, Yarn, pnpm, dan Bun untuk menjaga integritas dependensi proyek.
Penerapan const assertion dilakukan dengan menambahkan klausa as const di akhir nilai literal objek atau array untuk mengunci tipe data menjadi nilai konstan yang bersifat read-only secara mendalam. Fitur ini mengubah properti yang tadinya memiliki tipe umum seperti string atau number menjadi literal types yang tidak dapat dimutasi.
1// Objek biasa: compiler menyimpulkan propertinya sebagai string umum2const defaultEndpoints = {3 telemetry: "/api/v1/telemetry",4 videoStream: "/stream/live",5};6defaultEndpoints.telemetry = "/api/v2/new-path"; // Operasi diizinkan oleh TypeScript78// Objek dengan const assertion: compiler mengunci seluruh properti secara rekursif9const appConfig = {10 telemetry: "/api/v1/telemetry",11 videoStream: "/stream/live",12 maxPayloadWeightGram: 1500,13} as const;1415// appConfig.telemetry = "/other"; // Error: Cannot assign to 'telemetry' because it is a read-only property.1const supportedSensors = ["LiDAR", "Thermal", "Multispectral", "RGB"] as const;23// Mengekstrak union type dari array di atas secara otomatis4type SensorType = typeof supportedSensors[number];5// Tipe SensorType sekarang setara dengan: "LiDAR" | "Thermal" | "Multispectral" | "RGB"67let selectedSensor: SensorType = "Thermal";Variabel yang dideklarasikan menggunakan let dan const tunduk pada batasan block scope yang dibatasi oleh pasangan kurung kurawal {}:
1function runDiagnosticCheck() {2 const systemReady = true;34 if (systemReady) {5 const diagnosticCode = "PASS_001";6 let internalCounter = 10;7 console.log(diagnosticCode); // Dapat diakses di dalam blok if8 }910 // console.log(diagnosticCode); // Error: Cannot find name 'diagnosticCode'.11}1function checkTemporalDeadZone() {2 // console.log(missionName); // Error: Block-scoped variable 'missionName' used before its declaration.3 const missionName = "Mapping Delta Area";4 console.log(missionName); // Baris yang sah5}1// Memberitahu TypeScript bahwa variabel global ini ada di runtime lingkungan produksi2declare const GOOGLE_MAPS_API_KEY: string;34function initializeMap() {5 if (typeof GOOGLE_MAPS_API_KEY !== "undefined") {6 console.log(`Menginisialisasi peta dengan kunci lisensi sah.`);7 }8}1let batteryVoltage: number = 24.5;2// batteryVoltage = "24.5 V"; // Memicu TS232234// Solusi: Lakukan konversi data secara eksplisit atau sesuaikan tipe data variabel5batteryVoltage = parseFloat("24.5 V");1let pilotLicenseNumber: string;23// console.log(pilotLicenseNumber); // Memicu TS245445// Solusi: Berikan nilai awal saat deklarasi atau pastikan inisialisasi berjalan di semua cabang logika6pilotLicenseNumber = "RPC-DEFAULT-000";7console.log(pilotLicenseNumber);Masalah ini muncul saat variabel dideklarasikan tanpa tipe eksplisit dan tanpa nilai awal ketika opsi noImplicitAny diaktifkan pada file konfigurasi tsconfig.json.
1// let missionPayload; // Memicu TS7005 bila opsi strict aktif23// Solusi: Cantumkan anotasi tipe data yang jelas sejak baris deklarasi pertama4let missionPayload: string | object;5missionPayload = { sensor: "thermal" };batteryLevelIndicator.hasGpsSignal, isEngineRunning, atau canProceedToWaypoint.DEFAULT_TIMEOUT_MILLISECONDS.let p = 10; dan ganti dengan nama lengkap seperti let payloadWeightKilogram = 10;.userList daripada userArray.1// Konstanta global tingkat modul2const MAXIMUM_SAFE_WIND_SPEED_KNOTS: number = 25;34// Variabel objek terstruktur5interface DroneTelemetryPackage {6 deviceId: string;7 currentSpeedKnots: number;8 isGeofenceViolated: boolean;9}1011// Variabel lokal berformat camelCase12const primaryTelemetryData: DroneTelemetryPackage = {13 deviceId: "UAV-ALPHA-01",14 currentSpeedKnots: 18.4,15 isGeofenceViolated: false,16};1718if (primaryTelemetryData.currentSpeedKnots > MAXIMUM_SAFE_WIND_SPEED_KNOTS) {19 console.warn("Kecepatan angin melebihi ambang batas operasional aman.");20}Kombinasi penulisan tipe data yang presisi dan nama variabel yang terstruktur rapi akan mempercepat proses code review dan meminimalkan celah bug saat aplikasi dipelihara di kemudian hari. Metode kerja yang disiplin ini selaras dengan tren rekayasa software terbaru seperti pola kerja Vibe Coding Gaya Coding Masa Depan yang memadukan kecepatan penulisan dan kejelasan arsitektur program.