Keserasian Jenis di TypeScript

Hai sana, para ahli pengkomputeran masa depan! Hari ini, kita akan melangkah ke dalam dunia TypeScript dan menjelajahi konsep menarik Keserasian Jenis. Jangan khawatir jika anda baru dalam bidang pemrograman – saya akan menjadi panduannya yang ramah, dan kita akan menangani topik ini secara berperingkat. Jadi, pegang keyboard anda (tongkat sihir virtual), dan mari kita melontarkan beberapa mantra TypeScript!

TypeScript - Type Compatibility

Bagaimana TypeScript Melakukan Pemeriksaan Keserasian Jenis?

Bayangkan anda mencoba menempatkan blok berbentuk berbeda ke dalam lubang. Keserasian jenis di TypeScript sedikit mirip dengan itu – tentang apakah satu jenis dapat masuk ke jenis lain. Tetapi bukan bentuk fisik, melainkan jenis data.

Tipe Struktural

TypeScript menggunakan apa yang kita sebut "tipe struktural". Ini berarti dia lebih peduli tentang bentuk objek daripada namanya. mari kita lihat contoh:

interface Pet {
name: string;
}

class Dog {
name: string;
}

let pet: Pet;
let dog = new Dog();

pet = dog; // Ini baik!

Dalam keadaan ini, TypeScript mengatakan, "Hey, Pet dan Dog keduanya memiliki properti name tipe string. Mereka terlihat sama padanya bagi saya, jadi mereka keserasian!" Itu seperti mengatakan lubang persegi cocok dengan batang persegi, bahkan jika satu disebut "persegi" dan lainnya "blok".

Tipe Duck

Ada frasa menyenangkan dalam pemrograman: "Jika ia berjalan seperti bebek dan kicau seperti bebek, maka ia pasti adalah bebek." Ini esensi dari tipe duck, dan TypeScript mengakui filosofi ini. mari kita lihat dalam tindakan:

interface Quacker {
quack(): void;
}

class Duck {
quack() {
console.log("Quack!");
}
}

class Person {
quack() {
console.log("Saya meniru bebek!");
}
}

let quacker: Quacker = new Duck(); // tentu saja baik
quacker = new Person(); // Ini juga baik!

TypeScript tidak peduli bahwa Person tidak secara eksplisit dideklarasikan sebagai Quacker. Dia hanya peduli bahwa Person memiliki metode quack, sama seperti Quacker memiliki. Jadi keduanya Duck dan Person keserasian dengan Quacker.

Bagaimana Menggunakan Keserasian Jenis secara Efektif?

Menggunakan keserasian jenis secara efektif adalah seperti menjadi penyelesaikan teka-teki berkelasa. Berikut adalah beberapa tips:

1. Mengerti Pemeriksaan Literal Objek

TypeScript lebih ketat dengan literal objek. mari kita lihat mengapa:

interface Point {
x: number;
y: number;
}

let p: Point;

// Ini baik
p = { x: 10, y: 20 };

// Ini akan menyebabkan kesalahan
p = { x: 10, y: 20, z: 30 };

TypeScript mengatakan, "Whoa there! Saya meminta Point, tapi Anda memberikan saya sesuatu ekstra (z). Itu tidak diizinkan!" Ini membantu menangkap kutu yang mungkin terjadi saat Anda menggunakan objek secara salah.

2. Gunakan Properti Opsional

kadang-kadang, Anda ingin lebih fleksibel. Itu di mana properti opsional berguna:

interface Options {
color?: string;
width?: number;
}

function configure(options: Options) {
// ...
}

configure({ color: "red" }); // Baik
configure({ width: 100 }); // Baik
configure({}); // Juga baik!

Dengan membuat properti opsional (dengan tanda ?), Anda memberitahu TypeScript, "Itu baik jika ini tidak selalu ada."

Fungsi dan Keserasian Jenis

Fungsi adalah seperti pisau瑞士 Army knife pemrograman – mereka sangat multifungsi. mari kita lihat bagaimana keserasian jenis bekerja dengan mereka:

Keserasian Parameter

TypeScript sangat lunak dengan parameter fungsi:

let x = (a: number) => 0;
let y = (b: number, s: string) => 0;

y = x; // Baik
x = y; // Kesalahan

Ini mungkin terlihat berlawanan, tapi itu aman. TypeScript mengatakan, "Jika Anda mengharapkan fungsi yang mengambil dua parameter, itu baik untuk memberikan fungsi yang mengambil lebih sedikit. Parameter ekstra hanya akan diabaikan."

Keserasian Tipe Return

Tipe return juga perlu keserasian:

let x = () => ({name: "Alice"});
let y = () => ({name: "Alice", location: "Wonderland"});

x = y; // Baik
y = x; // Kesalahan

Itu baik untuk mengembalikan lebih banyak daripada yang diperkirakan, tapi bukan kurang. Itu seperti memesan pizza dan mendapatkan topping ekstra secara gratis – itu baik! Tetapi jika Anda memesan pizza dengan topping dan mendapatkan hanya crust, Anda akan kecewa.

Kelas dan Keserasian Jenis

Kelas adalah seperti blueprint untuk objek, dan mereka mengikuti aturan keserasian yang sama:

class Animal {
feet: number;
constructor(name: string, numFeet: number) { }
}

class Size {
feet: number;
}

let a: Animal;
let s: Size;

a = s; // Baik
s = a; // Baik

TypeScript hanya peduli dengan anggota instance. Dia mengatakan, "Keduanya memiliki properti feet? cukup untuk saya!"

Anggota Private dan Protected

Namun, saat kelas memiliki anggota private atau protected, hal itu menjadi lebih ketat:

class Animal {
private name: string;
constructor(theName: string) { this.name = theName; }
}

class Rhino extends Animal {
constructor() { super("Rhino"); }
}

class Employee {
private name: string;
constructor(theName: string) { this.name = theName; }
}

let animal = new Animal("Goat");
let rhino = new Rhino();
let employee = new Employee("Bob");

animal = rhino; // Baik
animal = employee; // Kesalahan: 'Animal' dan 'Employee' tidak keserasian

Meskipun Animal dan Employee terlihat sama, TypeScript memperlakukannya berbeda karena anggota private mereka berasal dari deklarasi yang berbeda.

Kesimpulan

Dan itu adalah, para murid pemrograman saya! Kita telah melakukan perjalanan melalui negeri keserasian jenis TypeScript. Ingat, TypeScript disini untuk membantu Anda menulis kode yang lebih baik dan aman. Itu seperti memiliki penyihir ramah yang memantau Anda, memberi nudge kecil saat Anda hampir membuat kesalahan.

Tetap latih, tetap eksperimen, dan segera Anda akan melontarkan mantra TypeScript seperti seorang pro! Sampai jumpa lagi, coding yang menyenangkan!

Metode Deskripsi
Tipe Struktural Memeriksa keserasian berdasarkan struktur jenis, bukan namanya
Tipe Duck Jika memiliki properti/metode yang diperlukan, maka dianggap keserasian
Pemeriksaan Literal Objek Pemeriksaan ketat untuk literal objek untuk menangkap kesalahan potensial
Properti Opsional Gunakan ? untuk membuat properti opsional, meningkatkan fleksibilitas
Keserasian Parameter Fungsi dengan parameter kurang dapat diassign ke fungsi dengan parameter lebih banyak
Keserasian Tipe Return Fungsi dapat mengembalikan lebih banyak daripada yang diperkirakan, tapi bukan kurang
Keserasian Kelas Berdasarkan anggota instance, bukan constructor atau anggota static
Anggota Private/Protected Kelas dengan anggota private/protected hanya keserasian dengan subclass mereka sendiri

Credits: Image by storyset