Pick<T, K>
آخر تحديث: 2026-10-22
Pick<T, K> Pick
يقطف Pick<T, K> من T الخصائص المسماة في K ليؤلف منها نوعًا جديدًا. عندما تحتاج إلى شريحة صغيرة من نوع كبير فقط (ملخصات القوائم، وسائط فرعية) لا داعي لكتابة نوع مكرر يدويًا — كما أنه إذا تغيّرت أنواع الحقول في المصدر تلحق بها النتيجة تلقائيًا.
| المجموعة | الأنواع المساعدة |
|---|---|
| النوع | نوع |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
// الاستخدام
type OrderSummary = Pick<Order, "id" | "buyer" | "total">;
⚙️ المعاملات
| T | نوع الكائن المصدر الذي تُنتقى منه الخصائص |
|---|---|
| K extends keyof T | اتحاد المفاتيح المراد الاحتفاظ بها؛ يجب أن تكون مفاتيح قائمة في T — والمفتاح المكتوب خطأً يعطي خطأ ترجمة (وهذا مصدر أمان Pick) |
القيمة المُعادة:نوع جديد: يحتوي الخصائص المسمّاة في K فقط، بأنواع مطابقة لنظيراتها في T.
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
{"id":"A-1024","buyer":"Carol","total":259}
(مخرجات التشغيل بعد الترجمة؛ محاولة الوصول إلى order.address على OrderSummary خطأ في الترجمة — فالحقول خارج قائمة Pick البيضاء غير موجودة في النوع)
💡 نقاط مهمة
ℹ️ معلومة التطبيق: type Pick<T, K extends keyof T> = { [P in K]: T[P] } — حيث K اتحاد مفاتيح والنوع المُعَيَّن يسحب نوع كل خاصية بدوره.
⚠️ تنبيه الـ Pick قائمة بيضاء: الحقول التي ستُضاف إلى Order لاحقًا لن تظهر تلقائيًا في النتيجة. فإذا كان مقصدك «كل شيء عدا بعض الحقول» فاستخدم Omit (قائمة سوداء) وإلا تسربت الحقول الجديدة منك بصمت.
💡 تلميح قاعدة خبرة: إن كان المطلوب قليلاً استخدم Pick، وإن كان المستبعد قليلاً استخدم Omit. وكلاهما انتقاء سطحي على مستوى الأنواع — الكائنات المتداخلة تبقى مراجع مشتركة.
🏷️ الأنواع المساعدة ذات صلة
💡 حالات ذات صلة
المزيد من الحالات قادم قريبًا.
📚 دروس ذات صلة
❓ أسئلة شائعة
س هل يؤثر تعديل كائن مُنتقى (Picked) على الأصل؟
ج ينتقي Pick الخصائص على مستوى النوع فقط ولا ينسخ أي بيانات. مشاركة التشغيل تتوقف على شيفرك (في المثال يبني toSummary كائنًا جديدًا بالتفكيك)؛ وإذا مررت المرجع نفسه فبالطبع يظهر التعديل لدى الطرفين.
س ماذا يحدث لو انتقيت مفتاحًا غير موجود؟
ج خطأ ترجمة: Type '"oderId"' is not assignable to type 'keyof Order'. فالـ K مقيّد بـ keyof T فيتكشف الخطأ الإملائي فورًا — وهذا ما يجعل Pick أكثر أمانًا من Omit (الذي لا يجري هذا الفحص).
س هل يمكن لـ Pick انتقاء الدوال (المناهج) أيضًا؟
ج نعم. الدوال خصائص، فالصيغة Pick<T, "save"> تعطي نوعًا مثل { save: () => void } مع توقعات ربط this نفسها في النوع الأصلي.