Rumah >hujung hadapan web >tutorial js >Memahami Kata Kunci kesimpulan dalam TypeScript

Memahami Kata Kunci kesimpulan dalam TypeScript

Linda Hamilton
Linda Hamiltonasal
2024-09-28 06:17:02842semak imbas

Understanding the infer Keyword in TypeScript

TypeScript, superset JavaScript yang ditaip secara statik, telah mendapat populariti besar dalam komuniti teknologi kerana keupayaannya untuk menangkap ralat awal dan meningkatkan kebolehbacaan kod. Salah satu ciri hebat TypeScript ialah kata kunci kesimpulan, yang membolehkan pembangun menulis jenis yang lebih ekspresif dan dinamik.

Kata Kunci Infer

Diperkenalkan dalam TypeScript 2.8, kata kunci kesimpulan digunakan dalam jenis bersyarat untuk mencipta pembolehubah jenis sementara. Pembolehubah jenis ini kemudiannya boleh digunakan untuk membuat kesimpulan jenis dalam cawangan benar atau palsu bagi jenis bersyarat. Kata kunci kesimpulan membolehkan pembangun menulis jenis yang lebih dinamik dan ekspresif, kerana ia membolehkan TypeScript menentukan jenis tertentu berdasarkan konteks yang digunakan.

Untuk lebih memahami cara kesimpulan berfungsi, mari kita lihat sintaks asas jenis bersyarat:

type MyConditionalType<T> = T extends SomeType ? TrueType : FalseType;

Dalam contoh ini, T ialah parameter jenis generik dan SomeType mewakili jenis yang sedang dibandingkan dengan T. Jika T memanjangkan SomeType, jenis MyConditionalType akan menjadi TrueType. Jika tidak, ia akan menjadi FalseType.

Sekarang, mari perkenalkan kata kunci kesimpulan ke dalam campuran:

type MyInferredType<T> = T extends SomeType<infer U> ? U : FalseType;

Di sini, kami menggunakan kata kunci kesimpulan untuk mencipta pembolehubah jenis sementara U dalam cawangan sebenar jenis bersyarat. Jika T memanjangkan SomeType, TypeScript akan cuba membuat kesimpulan jenis U berdasarkan jenis T.

Contoh

ReturnType

ReturnType ialah jenis utiliti yang mengekstrak jenis pemulangan fungsi. Ini adalah contoh sempurna tentang cara kata kunci kesimpulan boleh digunakan untuk membuat jenis dinamik. Berikut ialah definisi ReturnType:

type ReturnType<T extends (...args: any[]) => any> = T extends (...args: any[]) => infer R ? R : any;

Dalam takrifan ini, T ialah jenis fungsi yang mengambil sebarang bilangan argumen dan mengembalikan sebarang jenis. Menggunakan kata kunci kesimpulan, kami mencipta pembolehubah jenis sementara R untuk mewakili jenis pemulangan fungsi. Jika T ialah fungsi, TypeScript menyimpulkan jenis pulangan dan menetapkannya kepada R.

Jom lihat ReturnType dalam tindakan:

function greet(name: string): string {
  return `Hello, ${name}!`;
}
​
type GreetReturnType = ReturnType<typeof greet>; // GreetReturnType is inferred as 'string'

Di sini, ReturnType digunakan untuk membuat kesimpulan jenis pemulangan fungsi salam, iaitu rentetan.

Parameter

Satu lagi jenis utiliti berguna yang memanfaatkan kata kunci kesimpulan ialah Parameter. Jenis ini mengekstrak jenis parameter fungsi sebagai tupel. Takrifan Parameter adalah seperti berikut:

type Parameters<T extends (...args: any[]) => any> = T extends (...args: infer P) => any ? P : never;

Dalam contoh ini, kami mencipta pembolehubah jenis sementara P untuk mewakili jenis parameter fungsi. Jika T ialah fungsi, TypeScript menyimpulkan jenis parameter dan menetapkannya kepada P sebagai tuple.

Mari kita lihat contoh menggunakan Parameter:

function add(a: number, b: number): number {
  return a + b;
}
​
type AddParameters = Parameters<typeof add>; // AddParameters is inferred as [number, number]

Di sini, Parameter digunakan untuk membuat kesimpulan jenis parameter fungsi tambah, iaitu tuple [nombor, nombor].

PromiseType

Jenis utiliti PromiseType boleh digunakan untuk mengekstrak jenis yang ditetapkan oleh Promise. Ini amat berguna apabila berurusan dengan fungsi tak segerak. Berikut ialah definisi PromiseType:

type PromiseType<T extends Promise<any>> = T extends Promise<infer U> ? U : never;

Dalam contoh ini, kami mencipta pembolehubah jenis sementara U untuk mewakili jenis yang Janji selesaikan. Jika T ialah Janji, TypeScript menyimpulkan jenis yang diselesaikan dan menetapkannya kepada U. Berikut ialah contoh:

async function fetchData(): Promise<string> {
  return "Fetched data";
}
​
type FetchedDataType = PromiseType<ReturnType<typeof fetchData>>; // FetchedDataType is inferred as 'string'

Dalam kes ini, PromiseType digunakan untuk membuat kesimpulan jenis yang janji fungsi fetchData diselesaikan, iaitu rentetan.

UnboxArray

Jenis utiliti UnboxArray boleh digunakan untuk mengekstrak jenis elemen dalam tatasusunan. Berikut ialah definisi UnboxArray:

type UnboxArray<T extends Array<any>> = T extends Array<infer U> ? U : never;

Dalam contoh ini, kami mencipta pembolehubah jenis sementara U untuk mewakili jenis elemen dalam tatasusunan. Jika T ialah tatasusunan, TypeScript menyimpulkan jenis elemen dan menetapkannya kepada U. Contohnya:

type MyArray = number[];

type ElementType = UnboxArray<MyArray>; // ElementType is inferred as 'number'

Di sini, UnboxArray digunakan untuk membuat kesimpulan jenis elemen dalam jenis MyArray, iaitu nombor.

Had

Walaupun kata kunci kesimpulan sangat berkuasa, ia mempunyai beberapa had:

  1. Ia hanya boleh digunakan dalam jenis bersyarat.

  2. Tidak selalu mungkin untuk TypeScript menyimpulkan jenis yang betul, terutamanya apabila berurusan dengan jenis kompleks atau rekursif. Dalam kes sedemikian, pembangun mungkin perlu menyediakan anotasi jenis tambahan atau memfaktorkan semula jenis mereka untuk membantu TypeScript membuat kesimpulan jenis yang betul.

Kesimpulan

Dengan memahami dan memanfaatkan kuasa kesimpulan, anda boleh mencipta projek TypeScript yang lebih fleksibel. Mula mempertimbangkan untuk memasukkan kata kunci kesimpulan ke dalam kit alat anda hari ini.

Jika anda mendapati ini membantu, sila pertimbangkan melanggan surat berita saya untuk lebih banyak artikel dan alatan berguna tentang pembangunan web. Terima kasih kerana membaca!

Atas ialah kandungan terperinci Memahami Kata Kunci kesimpulan dalam TypeScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn