Pelindung Tipe TypeScript

Pelindung tipe merupakan fitur hebat dalam TypeScript yang memungkinkan pengembang untuk melakukan pemeriksaan saat dijalankan guna mempersempit tipe variabel. Hal ini memastikan informasi tipe yang lebih tepat, sehingga menghasilkan kode yang lebih aman dan lebih mudah diprediksi. Artikel ini membahas apa itu pelindung tipe dan cara menggunakannya secara efektif.

Apa itu Type Guard?

Pelindung tipe adalah ekspresi yang melakukan pemeriksaan saat dijalankan dan memungkinkan TypeScript untuk menyimpulkan tipe yang lebih spesifik untuk suatu variabel. Pelindung tipe membantu dalam membedakan antara tipe yang berbeda, terutama saat menangani tipe gabungan. Pelindung tipe dapat diimplementasikan menggunakan berbagai teknik, termasuk:

  • Predikat tipe yang ditentukan pengguna
  • Pernyataan tipe
  • Pemeriksaan instans
  • Menggunakan operator typeof
  • Menggunakan operator in

Predikat Tipe yang Ditentukan Pengguna

Predikat tipe yang ditentukan pengguna adalah fungsi yang mengembalikan nilai boolean dan memiliki tipe pengembalian khusus yang menunjukkan tipe variabel yang sedang diperiksa. Berikut cara membuat dan menggunakannya:

function isString(value: any): value is string {
  return typeof value === 'string';
}

function printString(value: any) {
  if (isString(value)) {
    console.log(value.toUpperCase()); // TypeScript knows value is a string here
  } else {
    console.log('Not a string');
  }
}

Dalam contoh di atas, isString adalah predikat tipe yang ditentukan pengguna yang membantu TypeScript memahami bahwa value adalah string dalam blok if.

Penegasan Tipe

Pernyataan tipe memberi tahu TypeScript untuk memperlakukan variabel sebagai tipe tertentu. Metode ini tidak melakukan pemeriksaan saat runtime, tetapi memberi tahu kompiler TypeScript tentang tipe tersebut. Misalnya:

function printLength(value: any) {
  console.log((value as string).length); // Assert value is a string
}

Dalam contoh ini, value as string memberi tahu TypeScript untuk menganggap bahwa value adalah string tanpa melakukan pemeriksaan runtime.

Pemeriksaan Instansi

Pemeriksaan instans digunakan untuk menentukan apakah suatu objek merupakan instans dari kelas tertentu. Ini berguna untuk mempersempit tipe saat bekerja dengan kelas:

class Dog {
  bark() { console.log('Woof'); }
}

class Cat {
  meow() { console.log('Meow'); }
}

function speak(animal: Dog | Cat) {
  if (animal instanceof Dog) {
    animal.bark(); // TypeScript knows animal is a Dog here
  } else {
    animal.meow(); // TypeScript knows animal is a Cat here
  }
}

Dalam contoh ini, operator instanceof membantu TypeScript menyimpulkan tipe animal berdasarkan kelasnya.

Menggunakan Operator typeof

Operator typeof dapat digunakan untuk memeriksa tipe primitif seperti string, number, dan boolean:

function processValue(value: string | number) {
  if (typeof value === 'string') {
    console.log(value.toUpperCase()); // TypeScript knows value is a string here
  } else {
    console.log(value.toFixed(2)); // TypeScript knows value is a number here
  }
}

Di sini, typeof digunakan untuk memeriksa apakah value adalah string atau number dan mempersempit jenisnya sebagaimana mestinya.

Menggunakan Operator in

Operator in memeriksa keberadaan properti dalam suatu objek. Ini berguna untuk membedakan antara tipe yang memiliki properti umum:

interface Bird {
  fly: () => void;
}

interface Fish {
  swim: () => void;
}

function move(creature: Bird | Fish) {
  if ('fly' in creature) {
    creature.fly(); // TypeScript knows creature is a Bird here
  } else {
    creature.swim(); // TypeScript knows creature is a Fish here
  }
}

Dalam contoh ini, operator in membantu TypeScript menentukan apakah creature adalah Bird atau Fish berdasarkan keberadaan suatu metode.

Kesimpulan

Pelindung tipe TypeScript merupakan alat penting untuk bekerja dengan tipe secara fleksibel dan aman. Pelindung tipe memungkinkan pemeriksaan tipe yang lebih tepat dan dapat mencegah kesalahan runtime dengan memastikan bahwa tipe yang benar digunakan dalam berbagai skenario. Memahami dan menggunakan pelindung tipe secara efektif dapat menghasilkan kode TypeScript yang lebih tangguh dan mudah dipelihara.