TypeScript - Tipe Any: Kapal Samping Switzerland of Types

Hailah, bintang-bintang pemrograman masa depan! Hari ini, kita akan melihat salah satu ciri paling adaptif (dan kadang-kadang kontroversial) TypeScript: tipe any. Siapkan sabuk pengaman, karena kita akan melakukan perjalanan yang akan membuat Anda katakan, "Any-thing is possible!" (Maaf, saya tidak bisa menahan diri untuk membuat pemainan kata tersebut!)

TypeScript - Any

Apa Itu Tipe Any?

Sebelum kita masuk ke dalam, mari kita bayangkan Anda di acara makanan berupa potluck. Anda membawa makanan, tetapi Anda tidak yakin apa yang dibawa oleh orang lain. Itu seperti tipe any di TypeScript - itu dapat menyimpan nilai jenis apa pun, sama seperti piring Anda di potluck dapat menyimpan jenis makanan apa pun!

Dapat mewakili nilai apa pun

Tipe any adalah seperti yang namanya - itu dapat mewakili nilai apa pun di TypeScript. Itu seperti selembar kartu joker yang mengatakan, "Hai TypeScript, saya bisa menjadi apa yang saya inginkan!"

mari kita lihat beberapa contoh:

let myVariable: any = 42;
console.log(myVariable); // Output: 42

myVariable = "Hello, World!";
console.log(myVariable); // Output: Hello, World!

myVariable = true;
console.log(myVariable); // Output: true

myVariable = [1, 2, 3];
console.log(myVariable); // Output: [1, 2, 3]

Dalam contoh ini, kita mendeklarasikan myVariable sebagai tipe any. Kemudian kita tentukan nilai jenis yang berbeda kepadanya - sebuah bilangan, sebuah string, sebuah boolean, dan sebuah array. TypeScript tidak mengeluh karena any bisa, well, apa saja!

Parameter Fungsi Tipe any

Sekarang, mari kita katakan Anda membuat sebuah fungsi yang harus sangat fleksibel. Anda inginnya menerima parameter jenis apa pun. Itu di mana any berguna!

function printAnything(arg: any): void {
console.log(arg);
}

printAnything(42);          // Output: 42
printAnything("TypeScript"); // Output: TypeScript
printAnything([1, 2, 3]);    // Output: [1, 2, 3]

Dalam contoh ini, fungsi printAnything kita dapat menerima argumen jenis apa pun. Itu seperti seorang bouncer yang ramah di klub yang membolehkan semua orang masuk!

Objek Tipe any

kadang-kadang, Anda mungkin ingin membuat sebuah objek yang dapat memiliki properti jenis apa pun. Mari kita buat sebuah begi ajaib yang dapat menyimpan apa saja:

let magicalBag: { [key: string]: any } = {};

magicalBag.book = "Harry Potter";
magicalBag.wand = { wood: "Holly", core: "Phoenix feather" };
magicalBag.spells = ["Expelliarmus", "Lumos", "Accio"];

console.log(magicalBag);
// Output:
// {
//   book: "Harry Potter",
//   wand: { wood: "Holly", core: "Phoenix feather" },
//   spells: ["Expelliarmus", "Lumos", "Accio"]
// }

Di sini, magicalBag adalah sebuah objek yang dapat memiliki properti sebanyak apa pun, masing-masing dapat memiliki jenis apa pun. Itu seperti begi Mary Poppins - itu dapat menyimpan apa saja!

Mengapa Menggunakan Tipe any?

Anda mungkin berpikir, "Jika TypeScript tentang jenis, mengapa kita ingin menggunakan any?" Pertanyaan bagus! Berikut adalah beberapa konteks di mana any dapat berguna:

  1. Ketika bekerja dengan konten dinamis (seperti data dari API)
  2. Ketika secara bertahap mengubah proyek JavaScript ke TypeScript
  3. Ketika berurusan dengan pustaka pihak ketiga yang tidak memiliki definisi jenis

mari kita lihat contoh kerja dengan konten dinamis:

async function fetchUserData(userId: number): Promise<any> {
const response = await fetch(`https://api.example.com/users/${userId}`);
const userData = await response.json();
return userData; // Kita tidak tahu struktur pasti `userData`, jadi kita gunakan 'any'
}

// Penggunaan
fetchUserData(123).then(user => {
console.log(user.name);  // TypeScript tidak akan mengeluh, bahkan jika 'name' tidak ada
});

Dalam kasus ini, kita tidak yakin tentang struktur data yang kita terima, jadi kita gunakan any untuk mengatakan ke TypeScript, " Percayalah, saya tahu apa yang saya lakukan!"

Aserersi Jenis

kadang-kadang, Anda mungkin tahu lebih banyak tentang jenis suatu nilai daripada TypeScript. Itu di mana asersi jenis berguna. Itu seperti mengatakan ke TypeScript, "Saya tahu Anda pikir ini adalah any, tapi percayalah, ini jenis spesifik."

mari kita lihat bagaimana Anda bisa menggunakan asersi jenis:

let someValue: any = "Hello, TypeScript!";
let strLength: number = (someValue as string).length;

console.log(strLength); // Output: 20

Dalam contoh ini, kita mengatakan ke TypeScript, "Hey, saya tahu someValue adalah jenis any, tapi saya yakin ini adalah string. Jadi biarkan saya menggunakannya sebagai string."

Peringatan: Dengan Kekuatan yang Besar, datang Tanggung Jawab yang Besar

Meskipun any kuat, itu seharusnya digunakan dengan hati-hati. Ingat, keuntungan utama TypeScript adalah pemeriksaan jenis. Dengan menggunakan any, Anda secara efektif mengatakan ke TypeScript untuk mematikan pemeriksaan jenis untuk variabel itu.

Berikut adalah contoh bagaimana any dapat menyebabkan kesalahan runtime:

let num: any = "42";
console.log(num.toFixed(2)); // Ini akan menyebabkan kesalahan runtime!

TypeScript tidak akan mengeluh tentang kode ini, tetapi itu akan melempar kesalahan saat Anda menjalankan itu karena string tidak memiliki metode toFixed.

Any vs. Unknown: Alternatif yang Lebih Aman

TypeScript 3.0 memperkenalkan jenis unknown, yang adalah lawan jenis aman dari any. Sementara any membolehkan Anda melakukan apa saja tanpa pemeriksaan, unknown memaksa pemeriksaan jenis.

mari kita bandingkan any dan unknown:

let anyVar: any = 10;
let unknownVar: unknown = 10;

let s1: string = anyVar;    // OK
let s2: string = unknownVar; // Kesalahan: Jenis 'unknown' tidak dapat ditetapkan ke jenis 'string'

// Kita perlu memeriksa jenis sebelum menggunakan `unknownVar`
if (typeof unknownVar === 'string') {
let s3: string = unknownVar; // OK
}

Seperti yang Anda lihat, unknown lebih aman karena ia memaksa Anda untuk memeriksa jenis sebelum menggunakannya.

Tabel Metode

Berikut adalah tabel metode umum yang Anda mungkin gunakan dengan any:

Metode Deskripsi Contoh
typeof Mengembalikan string yang menunjukkan jenis operand yang belum dievaluasi typeof anyVar === 'string'
instanceof Menguji apakah prototype properti kontruktur muncul di mana saja dalam rantai prototype objek anyVar instanceof Array
Aserersi jenis Memberitahu compiler untuk menganggap nilai sebagai jenis tertentu (anyVar as string).length
Penjaga jenis Predikat jenis yang ditentukan pengguna untuk membantu membatasi jenis variabel if (isString(anyVar)) { ... }

Ingat, dengan any, Anda dapat menggunakan semua metode yang tersedia di JavaScript, tetapi Anda kehilangan keuntungan pemeriksaan jenis TypeScript.

Dan itu dia, teman-teman! Anda baru saja melakukan penyelaman mendalam ke dunia tipe any di TypeScript. Ingat, meskipun any dapat menjadi alat yang kuat, gunakannya bijaksana dan bertanggung jawab. Selamat memesan, dan may the types be ever in your favor!

Credits: Image by storyset