TypeScript Academy · Pelajaran

Jenis Bersyarat Teragih

Kawal cara jenis bersyarat diagihkan merentas kesatuan.

Pelajaran 4 daripada 413 langkah

Jenis Bersyarat Teragih ialah pelajaran TypeScript Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran TypeScript Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus TypeScript Academy merangkumi sejumlah 4 pelajaran.

Tingkah Laku yang Mengejutkan

Jenis bersyarat mempunyai satu peraturan khusus: apabila jenis yang diperiksa ialah parameter jenis tanpa pembungkus dan anda menghantar kesatuan, jenis bersyarat itu diagihkan kepada setiap ahli secara berasingan, kemudian hasilnya digabungkan sebagai kesatuan.

Inilah asas bagi Exclude, Extract dan banyak utiliti lain.

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

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

Maksud "Tanpa Pembungkus"

"Tanpa pembungkus" bermaksud parameter jenis muncul bersendirian di sebelah kiri extends, bukannya dibungkus dalam jenis lain. Pengagihan hanya berlaku untuk parameter tanpa pembungkus.

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

Pengagihan Langkah demi Langkah

Untuk ToArray<string | number>, pengkompil menilai setiap ahli:

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

Kemudian, pengkompil menggabungkannya sebagai kesatuan: string[] | number[].

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

Menapis Kesatuan

Pengagihan memudahkan penapisan. Petakan ahli yang tidak dikehendaki kepada never; never hilang daripada kesatuan, lalu hanya ahli yang dikekalkan tinggal.

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

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

never Hilang dalam Kesatuan

Fakta penting: X | never dipermudah menjadi X. Jadi, apabila satu cabang yang diagihkan menghasilkan never, ahli itu sebenarnya dibuang daripada kesatuan akhir.

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

Melumpuhkan Pengagihan

Kadang-kadang anda tidak mahu pengagihan berlaku, contohnya apabila membandingkan seluruh kesatuan sebagai satu unit. Bungkus kedua-dua belah dalam tupel satu elemen: [T] extends [U]. Kini T tidak lagi tanpa pembungkus, jadi pengagihan dimatikan.

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

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

Mengapa Pembungkusan Berfungsi

Dengan meletakkan [T] di sebelah kiri, jenis yang diperiksa ialah tupel, bukannya parameter tunggal. Peraturan pengagihan khusus itu tidak lagi terpakai, jadi kesatuan diuji secara keseluruhan.

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

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

Diagihkan berbanding Tidak Diagihkan

Bandingkan kedua-dua bentuk secara terus. Versi tanpa pembungkus memeriksa setiap ahli; versi yang dibungkus memeriksa kesatuan sebagai satu jenis.

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

Bahagian Dalaman Exclude

Fungsi terbina dalam Exclude<T, U> membuang daripada T setiap ahli yang boleh ditugaskan kepada U. Ia hanyalah jenis bersyarat teragih yang memetakan ahli sepadan kepada never.

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

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

Bahagian Dalaman Extract

Extract<T, U> ialah imej cermin yang bertentangan: hanya mengekalkan ahli yang boleh ditugaskan kepada U. Pengagihan yang sama, tetapi cabang yang berlawanan.

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

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

Kekuatan Praktikal

Pengagihan membolehkan anda mengubah setiap ahli kesatuan dalam satu ungkapan: bina tatasusunan bagi setiap ahli, tambahkan awalan pada setiap rentetan, atau tapis berdasarkan bentuk. Dengan menggabungkannya bersama [T] extends [U] untuk pemeriksaan seluruh kesatuan, anda mengawal dengan tepat masa pengagihan berlaku.

Notasi: TypeScript sebenar menulis jenis literal templat menggunakan rentetan yang dibatasi tanda petik belakang dan mengandungi ruang letak dollar-brace. Dalam petikan kod ini, kami menunjukkan corak itu sebagai Tpl<...>, dengan menyenaraikan setiap bahagian mengikut tertib; contohnya, templat tanda petik belakang yang sepadan dengan awalan literal kemudian Rest muncul 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'

Semakan Pantas

Uji pemahaman anda tentang jenis bersyarat teragih.

Imbas Kembali

Jenis bersyarat teragih ialah enjin di sebalik utiliti kesatuan.

  • T extends U ? tanpa pembungkus diagihkan kepada setiap ahli kesatuan.
  • Cabang yang mengembalikan never menapis keluar ahli.
  • [T] extends [U] melumpuhkan pengagihan untuk pemeriksaan seluruh kesatuan.
  • Exclude dan Extract ialah jenis bersyarat teragih yang ringkas.

Seterusnya dalam Kursus 22: aritmetik dalam sistem jenis.

Percuma untuk bermula

Pelajari TypeScript dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
101
Pelajaran
352

Soalan Lazim

Adakah pelajaran “Jenis Bersyarat Teragih” percuma?

Ya — teks penuh “Jenis Bersyarat Teragih” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus TypeScript Academy, tingkat taraf kepada CoddyKit PRO. Kursus TypeScript Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Jenis Bersyarat Teragih”?

Kawal cara jenis bersyarat diagihkan merentas kesatuan. Anda berlatih TypeScript Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan TypeScript Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran TypeScript Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Jenis Bersyarat Teragih” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran TypeScript Academy ini?

Ya. Setiap pelajaran TypeScript Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Jenis sebagai Bahasa Pengiraan
  2. Bersyarat pada Aras Jenis
  3. Rekursi pada Aras Jenis
  4. Jenis Bersyarat Teragih
← Kembali ke TypeScript Academy