0Pricing
TypeScript Academy · Pelajaran

Jenis Kondisional Distributif

Kendalikan cara kondisional didistribusikan ke seluruh union.

Jenis Kondisional Distributif adalah pelajaran TypeScript Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar TypeScript Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus TypeScript Academy mencakup 4 pelajaran total.

Perilaku yang Mengejutkan

Tipe kondisional memiliki satu aturan khusus: ketika tipe yang diperiksa adalah parameter tipe polos dan Anda memberikan sebuah gabungan, kondisional didistribusikan ke setiap anggota secara terpisah, lalu hasilnya digabungkan.

Inilah dasar dari Exclude, Extract, dan banyak utilitas lainnya.

type ToArray<T> = T extends unknown ? T[] : never;

type A = ToArray<string | number>;
// string[] | number[]  (NOT (string | number)[])

Arti "Polos"

"Polos" berarti parameter tipe muncul sendirian di sebelah kiri extends, bukan dibungkus dalam tipe lain. Distribusi hanya terjadi pada parameter polos.

type Naked<T> = T extends string ? "y" : "n";
// T is naked -> distributes over unions

Distribusi Langkah demi Langkah

Untuk ToArray<string | number>, kompilator mengevaluasi setiap anggota:

  • ToArray<string> = string[]
  • ToArray<number> = number[]

Kemudian menggabungkannya: string[] | number[].

type R = ToArray<boolean>;
// boolean is true | false, so:
// true[] | false[]

Menyaring Gabungan

Distribusi membuat penyaringan menjadi mudah. Petakan anggota yang tidak diinginkan ke never; never menghilang dari gabungan, sehingga hanya anggota yang dipertahankan yang tersisa.

type Strings<T> = T extends string ? T : never;

type A = Strings<string | number | boolean>; // string

never Menghilang dalam Gabungan

Fakta penting: X | never disederhanakan menjadi X. Jadi, ketika sebuah cabang terdistribusi menghasilkan never, anggota tersebut secara efektif dihapus dari gabungan akhir.

type A = string | never;        // string
type B = "a" | never | "b";     // "a" | "b"

Menonaktifkan Distribusi

Terkadang Anda tidak menginginkan distribusi, misalnya saat membandingkan seluruh gabungan sebagai satu kesatuan. Bungkus kedua sisi dalam tupel yang memiliki satu elemen: [T] extends [U]. Sekarang T tidak lagi polos, sehingga distribusi dinonaktifkan.

type IsNever<T> = [T] extends [never] ? true : false;

type A = IsNever<never>;  // true
type B = IsNever<string>; // false

Mengapa Pembungkusan Berhasil

Dengan menempatkan [T] di sebelah kiri, tipe yang diperiksa menjadi tupel, bukan parameter yang berdiri sendiri. Aturan distribusi khusus tidak lagi berlaku, sehingga gabungan diuji secara keseluruhan.

type AllStrings<T> = [T] extends [string] ? true : false;

type A = AllStrings<"a" | "b">;     // true
type B = AllStrings<"a" | number>;  // false

Terdistribusi vs Tidak Terdistribusi

Bandingkan kedua bentuk tersebut secara langsung. Versi polos memeriksa setiap anggota; versi yang dibungkus memeriksa gabungan sebagai satu tipe.

type Distributed<T> = T extends string ? true : false;
type Wrapped<T> = [T] extends [string] ? true : false;

type A = Distributed<string | number>; // boolean (true | false)
type B = Wrapped<string | number>;     // false

Bagian Dalam Exclude

Exclude<T, U> bawaan menghapus dari T setiap anggota yang dapat ditetapkan ke U. Tipe ini hanyalah kondisional terdistribusi yang memetakan anggota yang cocok ke never.

type MyExclude<T, U> = T extends U ? never : T;

type A = MyExclude<"a" | "b" | "c", "b">; // "a" | "c"

Bagian Dalam Extract

Extract<T, U> adalah kebalikannya: pertahankan hanya anggota yang dapat ditetapkan ke U. Distribusinya sama, tetapi cabangnya berlawanan.

type MyExtract<T, U> = T extends U ? T : never;

type A = MyExtract<"a" | "b" | "c", "a" | "c">; // "a" | "c"

Kekuatan Praktis

Distribusi memungkinkan Anda mengubah setiap anggota gabungan dalam satu ekspresi: membangun larik untuk setiap anggota, menambahkan awalan pada setiap teks, atau menyaring berdasarkan bentuk. Jika digabungkan dengan [T] extends [U] untuk pemeriksaan seluruh gabungan, Anda dapat mengendalikan dengan tepat kapan distribusi terjadi.

Notasi: TypeScript yang sebenarnya menulis tipe literal templat dengan string yang dibatasi tanda backtick dan berisi celah dollar-brace. Dalam cuplikan ini, kami menampilkan pola tersebut sebagai Tpl<...>, dengan mencantumkan setiap bagian sesuai urutannya; misalnya, templat backtick yang cocok dengan awalan literal lalu Rest ditulis sebagai Tpl<'prefix', infer Rest>.

type Prefix<T extends string> = T extends unknown ? Tpl<'id_', T> : never;
// Tpl<'id_', T> is the template literal type joining 'id_' with each T

type A = Prefix<'a' | 'b'>; // 'id_a' | 'id_b'

Pemeriksaan Singkat

Uji pemahaman Anda tentang kondisional terdistribusi.

Rangkuman

Tipe kondisional terdistribusi adalah mesin di balik utilitas gabungan.

  • T extends U ? yang polos didistribusikan ke setiap anggota gabungan.
  • Cabang yang mengembalikan never menyaring anggota.
  • [T] extends [U] menonaktifkan distribusi untuk pemeriksaan seluruh gabungan.
  • Exclude dan Extract adalah kondisional terdistribusi yang sederhana.

Berikutnya di Kursus 22: aritmetika dalam sistem tipe.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Jenis Kondisional Distributif” gratis?

Ya — teks lengkap “Jenis Kondisional Distributif” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus TypeScript Academy, upgrade ke CoddyKit PRO. Kursus TypeScript Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Jenis Kondisional Distributif”?

Kendalikan cara kondisional didistribusikan ke seluruh union. Kamu berlatih TypeScript Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai TypeScript Academy?

Tidak diperlukan pengalaman sebelumnya. TypeScript Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Jenis Kondisional Distributif” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran TypeScript Academy ini?

Ya. Setiap pelajaran TypeScript Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Jenis sebagai Bahasa Komputasi
  2. Kondisional Tingkat Jenis
  3. Rekursi Tingkat Jenis
  4. Jenis Kondisional Distributif
← Kembali ke TypeScript Academy