Jenis Bersyarat Teragih
Kawal cara jenis bersyarat diagihkan merentas kesatuan.
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 unionsPengagihan 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>; // stringnever 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>; // falseMengapa 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>; // falseDiagihkan 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>; // falseBahagian 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
nevermenapis keluar ahli. [T] extends [U]melumpuhkan pengagihan untuk pemeriksaan seluruh kesatuan.ExcludedanExtractialah jenis bersyarat teragih yang ringkas.
Seterusnya dalam Kursus 22: aritmetik dalam sistem jenis.
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
- Jenis sebagai Bahasa Pengiraan
- Bersyarat pada Aras Jenis
- Rekursi pada Aras Jenis
- Jenis Bersyarat Teragih