Menu

Pick di TypeScript: Memilih Property dari Tipe (Contoh)

Pick<T, K> membuat tipe yang hanya berisi property T yang key-nya ada di K. Pelajari Pick dengan satu atau beberapa key, cara ia mengecek key, Pick vs Omit, memilih dari tipe bersarang, fungsi pick() bertipe, dan memilih property berdasarkan tipe nilainya.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

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 daftarkey yang dipertahankankey yang dihapus
Property baru di Ttidak disertakanotomatis disertakan
Key tak dikenal di Kerror kompilasi (TS2344)diterima diam-diam
Cocok untukresponse 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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai