Pick<T, K> adalah utility type bawaan yang membuat object type yang hanya berisi property T yang disebut di K. Pakai saat sebuah fungsi atau komponen hanya butuh beberapa field dari tipe yang lebih besar:
renderPreview menerima User yang lengkap dan juga object { id, name } biasa, karena ia hanya meminta apa yang dipakainya. Itu membuatnya lebih mudah dipanggil dan diuji. Pick hanya ada di level tipe: object ada yang lengkap tetap punya kelima property saat runtime.
Sintaks dan Pengecekan Key
Pick<Type, Keys>
Keys adalah satu key atau union dari beberapa key, dan setiap key harus ada di Type. Definisinya di standard library TypeScript menjadikan hal itu sebuah batasan:
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
Karena K extends keyof T, key yang salah eja atau tidak ada menjadi error kompilasi, dan editormu bisa melengkapi nama key secara otomatis:
Error-nya adalah error TS2344: Type '"cost"' does not satisfy the constraint 'keyof Product'. Ini perbedaannya dengan Omit, yang key-nya tidak dicek.
Pick Mempertahankan readonly dan Opsional
Pick melakukan mapping atas key milik T, jadi setiap property yang dipilih tetap membawa modifier-nya:
Baris terakhir menampilkan { id: 8 } karena readonly hanya pengecekan saat kompilasi: assignment itu dilaporkan, diredam dengan @ts-expect-error, dan tetap dijalankan. Untuk mengubah modifier sambil memilih, bungkus hasilnya: Partial<Pick<Account, "plan">> atau Required<Pick<Account, "email">>.
Pick vs Omit
Pick menyebut apa yang dipertahankan; Omit menyebut apa yang dibuang. Saat ini keduanya memberi hasil yang sama, tetapi perilakunya berbeda saat tipe sumbernya bertambah:
Pick<T, K> | Omit<T, K> | |
|---|---|---|
| Yang kamu daftar | key yang dipertahankan | key yang dihapus |
Property baru di T | tidak disertakan | otomatis disertakan |
Key tak dikenal di K | error kompilasi (TS2344) | diterima diam-diam |
| Cocok untuk | response API, tampilan publik, props | "semuanya kecuali yang rahasia" |
Untuk data yang keluar dari server-mu, Pick adalah pilihan default yang lebih aman: tidak ada yang muncul di tipe kecuali seseorang sengaja menambahkannya.
Memilih dari Tipe Bersarang
Pick hanya melihat key di level teratas: path bertitik seperti Pick<Customer, "address.city"> adalah error (TS2344), bukan pemilihan bersarang. Pakai indexed access type untuk mencapai tipe bersarangnya, lalu pilih dari situ:
Customer["address"] adalah tipe dari property address. Sintaks yang sama bisa mencapai elemen array: untuk property orders: Order[], Customer["orders"][number] adalah Order.
Fungsi pick() Bertipe
Pick tidak melakukan apa pun saat runtime. Fungsi generic kecil menyalin property yang dipilih ke object baru dan mengembalikan tepat Pick<T, K>:
K extends keyof T membuat TypeScript menyimpulkan K dari argumen string, sehingga tipe kembaliannya punya tepat key yang dipilih. Assertion {} as Pick<T, K> diperlukan karena object kosong belum punya property itu; perulangannya yang mengisinya.
Memilih Property Berdasarkan Tipe Nilainya
Pick memilih berdasarkan nama key. Untuk memilih berdasarkan tipe property, misalnya "semua field string", tulis mapped type dengan filter key:
Klausa as memetakan setiap key ke dirinya sendiri kalau tipenya cocok, dan ke never kalau tidak, lalu key never dibuang. Satu hal halus: tipe property opsional memuat undefined, jadi subtitle?: string yang opsional tidak dihitung sebagai string di sini; uji terhadap string | undefined untuk menyertakannya.
Pertanyaan yang sering diajukan
Apa fungsi Pick di TypeScript?
Pick<T, K> membangun object type yang hanya berisi property T yang key-nya ada di K. Pick<User, "id" | "name"> adalah { id: number; name: string } kalau User punya dua property itu ditambah property lain. Pick hanya bekerja pada tipe dan tidak menghapus apa pun dari object saat runtime.
Apa perbedaan Pick dan Omit?
Pick mendaftar property yang dipertahankan, Omit mendaftar property yang dihapus. Saat tipe sumbernya mendapat property baru, Omit otomatis menyertakannya dan Pick tidak. Pick juga mengecek bahwa key-nya ada di tipe itu; Omit menerima key apa pun.
Bagaimana cara memilih beberapa property di TypeScript?
Berikan union dari beberapa key: Pick<User, "id" | "name" | "email">. Semua key itu harus ada di User, kalau tidak compiler melaporkan error TS2344.
Bagaimana cara memilih property bersarang di TypeScript?
Pick hanya memilih property di level teratas. Masuk ke tipe bersarang dengan indexed access type, lalu pilih dari situ: Pick<User["address"], "city">. Untuk mempertahankan strukturnya yang bersarang, gabungkan keduanya: Pick<User, "id"> & { address: Pick<User["address"], "city"> }.
Apakah Pick mempertahankan modifier readonly dan opsional?
Ya. Pick adalah mapped type atas key milik T, jadi property yang readonly atau opsional di T tetap seperti itu di tipe hasil pilihan.