الانتقال إلى المحتوى الرئيسي
الوحدة 4 · الدرس 2 من 28/14 في الدورة~15 min
دروس الوحدة (2/2)

أنواع المرافق

يوفر TypeScript العديد من أنواع المرافق العامة لتسهيل تحويلات الأنواع الشائعة. هذه الأنواع عامة وتسمح لك بإنشاء أنواع جديدة بشكل صريح من الأنواع الموجودة.

أنواع المرافق الأربعة الأكثر استخدامًا هي:

1. محمي_INLINE_0

يجعل جميع الخصائص من النوع T اختيارية. يعد هذا مفيدًا للغاية لوظائف التحديث/التصحيح حيث قد يقوم المتصل بتوفير مجموعة فرعية من الحقول فقط:

TS
interface User {
  id: number;
  name: string;
  email: string;
}

// All properties of User become optional: { id?: number; name?: string; email?: string; }
type UserUpdate = Partial<User>;

2. محمي_INLINE_2

يجعل كافة الخصائص من النوع T للقراءة فقط. أي محاولة لإعادة تعيين خاصية ستؤدي إلى حدوث خطأ في برنامج التحويل البرمجي:

TS
interface Point {
  x: number;
  y: number;
}

const p: Readonly<Point> = { x: 10, y: 20 };
// p.x = 5; // Error: cannot assign to 'x' because it is a read-only property

3. محمي_INLINE_4

ينشئ نوعًا عن طريق تحديد مجموعة محددة فقط من المفاتيح (ممثلة باتحاد سلسلة) من النوع T:

TS
interface Article {
  id: number;
  title: string;
  content: string;
  views: number;
}

// Selects only 'title' and 'views': { title: string; views: number; }
type ArticlePreview = Pick<Article, 'title' | 'views'>;

4. محمي_INLINE_6

ينشئ نوعًا عن طريق إزالة مجموعة محددة من المفاتيح من النوع T. إنه ثنائي Pick:

TS
interface Product {
  id: number;
  name: string;
  price: number;
  secretVendorCode: string;
}

// Removes 'secretVendorCode': { id: number; name: string; price: number; }
type PublicProduct = Omit<Product, 'secretVendorCode'>;

5. محمي_INLINE_9

ينشئ نوع كائن مفاتيح خصائصه هي Keys وقيم خصائصه هي Type. إنه مفيد للغاية لتعيين المفاتيح للقيم، وتمثيل القواميس أو جداول التجزئة (خرائط القيمة الرئيسية):

TS
type Page = 'home' | 'about' | 'contact';

interface PageInfo {
  title: string;
}

// Creates a dictionary with keys 'home' | 'about' | 'contact' and values PageInfo
const nav: Record<Page, PageInfo> = {
  home: { title: 'Home Page' },
  about: { title: 'About Us' },
  contact: { title: 'Contact Us' },
};

جربه بنفسك

التمرين 1: تحديث الملف الشخصي بشكل جزئي

تمرين#ts.m4.l2.e1
المحاولات: 0جارٍ التحميل…

أكمل وظيفة updateProfile التي تقبل ملف التعريف الأصلي (ملف التعريف) وكائن التحديثات (التحديثات) حيث تكون جميع حقول ملف التعريف اختيارية. يجب أن تقوم بإرجاع كائن ملف تعريف جديد يجمع بين الخصائص الأصلية والتحديثات.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم نوع الأداة المساعدة Partial<Profile> لمعلمة التحديثات، وعامل الانتشار لدمج الكائنات: { ...original, ...updates }.

الحل متاح بعد 3 من المحاولات

التمرين 2: إزالة الحقول الحساسة باستخدام حذف

تمرين#ts.m4.l2.e2
المحاولات: 0جارٍ التحميل…

بالنظر إلى نوع UserAccount، قم بتعريف نوع الاسم المستعار المسمى SafeUser الذي يتجاهل خاصيةpasswordHash الحساسة.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم النوع SafeUser = Omit<UserAccount, 'passwordHash'>; لحذف الحقل المحدد.

الحل متاح بعد 3 من المحاولات

التمرين 3: التكوين العام باستخدام الاختيار والقراءة فقط

تمرين#ts.m4.l2.e3
المحاولات: 0جارٍ التحميل…

بالنظر إلى نوع AppConfig، قم بتعريف نوع مستعار يسمى PublicConfig وهو إصدار للقراءة فقط (للقراءة فقط) يحتوي فقط على نقطة API وخصائص المنفذ المحددة باستخدام Pick.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم النوع PublicConfig = Readonly<Pick<AppConfig, 'apiEndpoint' | 'المنفذ'>>;

الحل متاح بعد 3 من المحاولات

التمرين 4: سجل المستخدم مع السجل والقراءة فقط

تمرين#ts.m4.l2.e4
المحاولات: 0جارٍ التحميل…

نظرًا لواجهة مستخدم بمعرف الحقول: الرقم والاسم: سلسلة، قم بإنشاء نوع ReadOnlyUser الذي يجعل جميع الحقول في المستخدم للقراءة فقط. بعد ذلك، قم بإنشاء نوع UserRegistry الذي يمثل قاموسًا حيث يكون المفتاح عبارة عن سلسلة (على سبيل المثال، معرف السلسلة) والقيمة هي ReadOnlyUser.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم Readonly<User> لتعريف ReadOnlyUser، وRecord<string, ReadOnlyUser> للتسجيل.

الحل متاح بعد 3 من المحاولات