Cheatsheet TypeScript untuk Pemula dan Lanjutan
TypeScript adalah superset JavaScript yang memberikan fitur seperti tipe statis, kelas, antarmuka, dan banyak lagi. Panduan ini dirancang untuk pemula hingga tingkat lanjutan.
1. Instalasi dan Konfigurasi
Instalasi TypeScript:
npm install -g typescript
Inisialisasi Proyek TypeScript:
tsc --init
File tsconfig.json
akan dibuat. Contoh pengaturan penting:
{
"compilerOptions": {"target": "es6","module": "commonjs","strict": true,"esModuleInterop": true,"outDir": "./dist","rootDir": "./src"},"include": ["src/**/*"],"exclude": ["node_modules"]}
target
: Versi JavaScript output.module
: Jenis modul yang digunakan (commonjs
,esnext
).strict
: Mengaktifkan mode ketat untuk pemeriksaan tipe.outDir
: Direktori output file yang dikompilasi.rootDir
: Direktori utama sumber kode TypeScript.
2. Tipe Data
Tipe Dasar
let nama: string = "Saya";
let umur: number = 25;let aktif: boolean = true;let apapun: any = 42;let tidakTahu: unknown = "data";let kosong: null = null;let tidakTerdefinisi: undefined = undefined;
any
: Digunakan jika tipe tidak diketahui. Sebaiknya dihindari jika memungkinkan.unknown
: Mirip denganany
, tapi lebih aman karena memerlukan pemeriksaan tipe sebelum digunakan.
Array
let angka: number[] = [1, 2, 3];
let kata: Array<string> = ["a", "b", "c"];
- Gunakan notasi
number[]
atauArray<number>
.
Tuple
let tuple: [string, number] = ["satu", 1];
- Tuple digunakan untuk array dengan panjang dan tipe elemen tertentu.
Enum
enum Warna {
Merah = "Merah",Hijau = "Hijau",Biru = "Biru"}let warnaFavorit: Warna = Warna.Hijau;
- Enums membantu mendefinisikan nilai konstan.
Literal dan Union
let pilihan: "ya" | "tidak" = "ya";
let id: string | number = 123;
- Literal membatasi nilai ke opsi tertentu.
- Union memungkinkan beberapa tipe untuk satu variabel.
Tipe Alias
type ID = string | number;
let userId: ID = "12345";
- Gunakan
type
untuk mendefinisikan tipe khusus yang dapat digunakan kembali.
3. Fungsi
Deklarasi Fungsi
function tambah(a: number, b: number): number {
return a + b;}let kali = (a: number, b: number): number => a * b;
- Selalu tentukan tipe parameter dan nilai kembaliannya.
Optional dan Default Parameter
function salam(nama: string, umur?: number): string {
return umur ? `Halo ${nama}, umur ${umur}` : `Halo ${nama}`;}function perkenalan(nama: string, umur: number = 18): string {return `Halo ${nama}, umur ${umur}`;}
- Parameter opsional menggunakan
?
. - Parameter default diberikan nilai bawaan.
Fungsi Overloading
function ambilData(param: string): string;
function ambilData(param: number): number;function ambilData(param: any): any {return param;}
- Overloading memungkinkan fungsi menerima berbagai tipe parameter.
4. Interface dan Tipe
Interface
interface User {
id: number;nama: string;aktif?: boolean;}
- Gunakan
interface
untuk mendefinisikan struktur objek. - Properti opsional menggunakan
?
.
Extends Interface
interface Admin extends User {
level: string;}
- Interface dapat diperluas menggunakan
extends
.
Perbedaan Interface dan Tipe
- Interface mendukung merging.
- Type lebih fleksibel untuk tipe kompleks seperti union.
5. Kelas (Classes)
Deklarasi Dasar
class Hewan {
constructor(public nama: string) {}bergerak(): void {console.log(`${this.nama} bergerak`);}}let kucing = new Hewan("Kucing");kucing.bergerak();
Pewarisan (Inheritance)
class Burung extends Hewan {
terbang(): void {console.log(`${this.nama} terbang`);}}
- Gunakan
extends
untuk pewarisan kelas.
Access Modifiers
public
: Dapat diakses di mana saja (default).private
: Hanya dapat diakses di dalam kelas.protected
: Dapat diakses di dalam kelas dan turunannya.
Abstract Class
abstract class MakhlukHidup {
abstract bergerak(): void;}class Ikan extends MakhlukHidup {bergerak(): void {console.log("Ikan berenang");}}
- Gunakan
abstract
untuk kelas yang tidak dapat diinstansiasi langsung.
6. Modul dan Namespace
Export dan Import
File math.ts
:
export function tambah(a: number, b: number): number {
return a + b;}
File main.ts
:
import { tambah } from "./math";
console.log(tambah(2, 3));
Namespace
namespace Geometri {
export function luasPersegi(sisi: number): number {return sisi * sisi;}}console.log(Geometri.luasPersegi(5));
- Namespace digunakan untuk mengelompokkan kode tanpa menggunakan modul.
7. Advanced Types
Utility Types
Partial<T>
: Membuat semua properti opsional.Readonly<T>
: Membuat properti hanya-baca.Pick<T, K>
: Memilih properti tertentu.Omit<T, K>
: Menghilangkan properti tertentu.
interface User {
id: number;nama: string;aktif: boolean;}type OptionalUser = Partial<User>;type ReadonlyUser = Readonly<User>;type UserId = Pick<User, "id">;type UserTanpaAktif = Omit<User, "aktif">;
8. Decorator
Class Decorator
function LogKelas(constructor: Function) {
console.log(`Kelas dibuat: ${constructor.name}`);}@LogKelasclass Hewan {}
Method Decorator
function LogMethod(target: any, propertyName: string, descriptor: PropertyDescriptor) {
const original = descriptor.value;descriptor.value = function (...args: any[]) {console.log(`Method dipanggil: ${propertyName} dengan argumen: ${args}`);return original.apply(this, args);};}
- Decorator digunakan untuk menambahkan metadata atau logika pada kelas, metode, atau properti.
9. Error Handling
Try-Catch
try {
throw new Error("Terjadi kesalahan!");} catch (error) {console.log(error.message);}
Custom Error
class CustomError extends Error {
constructor(message: string) {super(message);this.name = "CustomError";}}
10. Best Practices
Gunakan
strict
mode ditsconfig.json
.- Memberikan pemeriksaan tipe yang ketat.
Hindari penggunaan
any
kecuali benar-benar diperlukan.- Gunakan
unknown
sebagai alternatif.
- Gunakan
Pisahkan tipe ke dalam file tersendiri jika kompleks.
Gunakan utility types untuk menghindari penulisan ulang tipe.