Pick<T, K>, T tipinin yalnızca K içinde adı geçen özelliklerini içeren bir nesne tipi oluşturan yerleşik bir utility type'tır. Bir fonksiyon ya da bileşen daha büyük bir tipin birkaç alanına ihtiyaç duyduğunda kullanın:
renderPreview hem eksiksiz bir User hem de düz bir { id, name } nesnesi kabul eder, çünkü yalnızca kullandığı şeyi ister. Bu onu çağırmayı ve test etmeyi kolaylaştırır. Pick yalnızca tip düzeyindedir: eksiksiz ada nesnesi çalışma zamanında hâlâ beş özelliğin hepsine sahiptir.
Sözdizimi ve Anahtar Kontrolü
Pick<Type, Keys>
Keys tek bir anahtar ya da anahtarlardan oluşan bir union'dır ve her biri Type üzerinde var olmalıdır. TypeScript'in standart kütüphanesindeki tanım bunu bir kısıtlama hâline getirir:
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
K extends keyof T sayesinde yanlış yazılmış ya da eksik bir anahtar derleme hatasıdır ve editörünüz anahtar adlarını otomatik tamamlayabilir:
Hata şudur: error TS2344: Type '"cost"' does not satisfy the constraint 'keyof Product'. Anahtarları kontrol edilmeyen Omit ile fark budur.
Pick readonly ve İsteğe Bağlılığı Korur
Pick, T tipinin anahtarları üzerinde eşleme yapar, bu yüzden seçilen her özellik değiştiricilerini korur:
Son satır { id: 8 } gösterir, çünkü readonly yalnızca derleme zamanında yapılan bir kontroldür: atama bildirildi, @ts-expect-error ile bastırıldı ve yine de çalıştı. Seçerken değiştiricileri değiştirmek için sonucu sarın: Partial<Pick<Account, "plan">> ya da Required<Pick<Account, "email">>.
Pick ve Omit
Pick neyin tutulacağını, Omit neyin atılacağını adlandırır. Bugün ikisi aynı sonucu verir, ama kaynak tip büyüdüğünde farklı davranırlar:
Pick<T, K> | Omit<T, K> | |
|---|---|---|
| Listelediğiniz | tutulacak anahtarlar | çıkarılacak anahtarlar |
T üzerindeki yeni özellikler | dahil edilmez | otomatik olarak dahil edilir |
K içinde bilinmeyen anahtar | derleme hatası (TS2344) | sessizce kabul edilir |
| Uygun olduğu yer | API yanıtları, public görünümler, props | "sır dışında her şey" |
Sunucunuzdan dışarı çıkan veri için Pick daha güvenli varsayılandır: biri bilerek eklemedikçe tipte hiçbir şey görünmez.
İç İçe Tiplerden Seçmek
Pick yalnızca en üst düzey anahtarları görür: Pick<Customer, "address.city"> gibi noktalı bir yol iç içe bir seçim değil, bir hatadır (TS2344). İç içe tipe ulaşmak için bir indexed access type kullanın, sonra ondan seçin:
Customer["address"], address özelliğinin tipidir. Aynı sözdizimi dizi elemanlarına da ulaşır: bir orders: Order[] özelliği için Customer["orders"][number] tipi Order olur.
Tipli Bir pick() Fonksiyonu
Pick çalışma zamanında hiçbir şey yapmaz. Küçük bir generic fonksiyon seçilen özellikleri yeni bir nesneye kopyalar ve tam olarak Pick<T, K> döndürür:
K extends keyof T, TypeScript'in K tipini string argümanlardan çıkarmasını sağlar; böylece dönüş tipi tam olarak seçilen anahtarlara sahip olur. {} as Pick<T, K> assertion'ı gereklidir, çünkü boş bir nesne henüz bu özelliklere sahip değildir; döngü onları doldurur.
Özellikleri Değer Tipine Göre Seçmek
Pick anahtar adına göre seçer. Özelliğin tipine göre seçmek için, örneğin "tüm string alanlar", anahtar filtresi olan bir mapped type yazın:
as ifadesi, tipi eşleşen her anahtarı kendisine, diğerlerini ise never tipine eşler ve never anahtarlar atılır. İnce bir nokta: isteğe bağlı bir özelliğin tipi undefined içerir, bu yüzden isteğe bağlı bir subtitle?: string burada string sayılmaz; onu dahil etmek için string | undefined tipine karşı test edin.
Sıkça Sorulan Sorular
TypeScript'te Pick ne işe yarar?
Pick<T, K>, T tipinin yalnızca anahtarları K içinde olan özelliklerini içeren bir nesne tipi oluşturur. User bu iki özelliğe ve başkalarına sahipse Pick<User, "id" | "name"> tipi { id: number; name: string } olur. Yalnızca tipler üzerinde çalışır ve çalışma zamanında nesnelerden hiçbir şey kaldırmaz.
Pick ile Omit arasındaki fark nedir?
Pick tutulacak özellikleri, Omit çıkarılacak olanları listeler. Kaynak tipe bir özellik eklendiğinde Omit onu otomatik olarak dahil eder, Pick etmez. Pick ayrıca anahtarlarının tipte var olduğunu kontrol eder; Omit her anahtarı kabul eder.
TypeScript'te birden fazla özelliği nasıl pick ederim?
Anahtarlardan oluşan bir union geçirin: Pick<User, "id" | "name" | "email">. Anahtarların hepsi User üzerinde var olmalıdır, yoksa derleyici TS2344 hatası verir.
TypeScript'te iç içe bir özelliği nasıl pick ederim?
Pick yalnızca en üst düzey özellikleri seçer. İç içe bir tipe bir indexed access type ile ulaşın ve ondan seçin: Pick<User["address"], "city">. İç içe yapıyı korumak için ikisini birleştirin: Pick<User, "id"> & { address: Pick<User["address"], "city"> }.
Pick readonly ve isteğe bağlı değiştiricileri korur mu?
Evet. Pick, T tipinin anahtarları üzerinde bir mapped type'tır; bu yüzden T içinde readonly ya da isteğe bağlı olan bir özellik, seçilen tipte de öyle kalır.