أنواع الأدوات في TypeScript

أنواع الأدوات في TypeScript

تشرح هذه المقالة أنواع الأدوات في TypeScript۔

YouTube Video

أنواع الأدوات في TypeScript

أنواع الأدوات في TypeScript هي أدوات مريحة لإنشاء أنواع جديدة بناءً على الأنواع الموجودة۔ يسمح ذلك بتعريفات أكثر مرونة للأنواع وزيادة قابلية إعادة استخدام الكود۔ سنشرح هنا أنواع الأدوات الشائعة الاستخدام بالتفصيل ونتحدث عن كيفية استخدام كل منها مع أمثلة للكود۔

Partial<T>

Partial<T> يجعل جميع خصائص نوع الكائن اختيارية (يسمح بـ undefined)۔ إنه مفيد عندما تريد استخدام بعض الخصائص فقط التي يمتلكها النوع الأصلي۔

 1interface User {
 2  id: number;
 3  name: string;
 4  age: number;
 5}
 6
 7function updateUser(user: Partial<User>) {
 8  console.log(user);
 9}
10
11updateUser({ name: "Alice" }); // Updates only 'name'

توضيح:

في المثال أعلاه، يجعل استخدام Partial<User> جميع خصائص نوع User اختيارية۔ لذلك، في وظيفة updateUser، يمكنك تمرير جزء فقط من الخصائص۔

Required<T>

Required<T> يجعل جميع الخصائص، بما في ذلك الخصائص الاختيارية، إلزامية۔ يُستخدم عندما تريد تحويل الخصائص الاختيارية إلى إلزامية۔

 1interface User {
 2  id: number;
 3  name?: string;
 4  age?: number;
 5}
 6
 7function createUser(user: Required<User>) {
 8  console.log(user);
 9}
10
11// createUser({ id: 1 }); // Error: 'name' and 'age' are required
12createUser({ id: 1, name: "Alice", age: 25 });

توضيح:

باستخدام Required<User>، يتم التعامل مع الخصائص مثل name و age كخصائص إلزامية۔

Readonly<T>

Readonly<T> يجعل جميع خصائص الكائن للقراءة فقط۔ هذا يمنع تغيير قيم الكائن۔

 1interface User {
 2  id: number;
 3  name: string;
 4}
 5
 6const user: Readonly<User> = {
 7  id: 1,
 8  name: "Alice"
 9};
10
11// user.id = 2; // Error: 'id' is read-only
12console.log(user);

توضيح:

باستخدام Readonly<T>، يمكنك حماية خصائص الكائن من التغيير۔ يكون ذلك فعالًا عندما تريد منع تعديل البيانات عن طريق الخطأ أثناء التطوير۔

Record<K, T>

Record<K, T> ينشئ نوع خريطة بأنواع مفاتيح وقيم محددة۔ K هو النوع المستخدم للمفاتيح (مثل string أو number)، و T هو النوع المستخدم للقيم۔

 1type Roles = "admin" | "user" | "guest";
 2interface Permissions {
 3  read: boolean;
 4  write: boolean;
 5}
 6
 7const rolePermissions: Record<Roles, Permissions> = {
 8  admin: { read: true, write: true },
 9  user: { read: true, write: false },
10  guest: { read: false, write: false },
11};
12
13console.log(rolePermissions);

توضيح:

Record<K, T> مفيد عندما تريد تعريف أزواج المفتاح والقيمة۔ في المثال أعلاه، يتم تعريف الأذونات بناءً على أدوار المستخدم۔

Pick<T, K>

Pick<T, K> يستخرج الخصائص المحددة فقط من نوع الكائن۔ يمكنك إنشاء نوع جديد عن طريق استخراج الخصائص الضرورية فقط۔

 1interface User {
 2  id: number;
 3  name: string;
 4  age: number;
 5}
 6
 7type UserSummary = Pick<User, "id" | "name">;
 8
 9const summary: UserSummary = {
10  id: 1,
11  name: "Alice"
12};
13
14console.log(summary);

توضيح:

باستخدام Pick<T, K>، يمكنك استخراج خصائص محددة من نوع كائن ومعاملتها كنمط جديد۔ على سبيل المثال، يتم استخراج id و name فقط في المثال أعلاه۔

Omit<T, K>

Omit<T, K> يستبعد الخصائص المحددة من نوع الكائن۔ هذه العملية عكسية لعملية Pick۔

 1interface User {
 2  id: number;
 3  name: string;
 4  age: number;
 5  email: string;
 6}
 7
 8type UserWithoutEmail = Omit<User, "email">;
 9
10const userWithoutEmail: UserWithoutEmail = {
11  id: 1,
12  name: "Alice",
13  age: 25
14};
15
16console.log(userWithoutEmail);

توضيح:

من خلال استخدام Omit<T, K>، يمكنك إنشاء نوع جديد عن طريق استبعاد الخصائص المحددة۔ في المثال أعلاه، خاصية email مستبعَدة۔

Exclude<T, U>

Exclude<T, U> ينشئ نوعًا جديدًا عن طريق إزالة النوع U من النوع الموحد T۔ يُستخدم عندما ترغب في إزالة نوع محدد۔

1type Status = "active" | "inactive" | "pending";
2type ExcludedStatus = Exclude<Status, "pending">;
3
4const status: ExcludedStatus = "active"; // "pending" is excluded, so it cannot be chosen
5console.log(status);

توضيح:

من خلال استخدام Exclude<T, U>، يمكنك إزالة الأنواع غير الضرورية داخل نوع موحد۔ في المثال أعلاه، نظرًا لاستبعاد "pending"، يمكن اختيار "active" أو "inactive" فقط۔

Extract<T, U>

Extract<T, U> يستخرج الأقسام التي تطابق النوع U داخل النوع الموحد T۔ يكون مفيدًا عندما ترغب في استخراج نوع محدد فقط۔

1type Status = "active" | "inactive" | "pending";
2type ActiveStatus = Extract<Status, "active" | "pending">;
3
4const status: ActiveStatus = "active"; // "inactive" cannot be chosen
5console.log(status);

توضيح:

Extract<T, U> ينفذ عملية معاكسة لـ Exclude۔ في المثال أعلاه، يمكن اختيار "active" و"pending" فقط۔

NonNullable<T>

NonNullable<T> ينشئ نوعًا يستبعد null وundefined۔ يكون مفيدًا عندما ترغب في استبعاد هذه القيم من الأنواع الاختيارية۔

1type UserName = string | null | undefined;
2type ValidUserName = NonNullable<UserName>;
3
4const name: ValidUserName = "Alice"; // null and undefined cannot be chosen
5console.log(name);

توضيح:

NonNullable<T> يستبعد null وundefined من النوع الذي يحتوي عليهما۔ يكون هذا مفيدًا عندما تريد التأكد من أن القيمة موجودة بالتأكيد۔

الخاتمة

أنواع الأدوات المساعدة في TypeScript هي أدوات قوية لجعل تعريفات الأنواع أكثر اختصارًا ومرونة۔ فهم واستخدام أنواع الأدوات المساعدة الأساسية مثل Partial، Required، Readonly، Record، إلخ، بشكل مناسب يمكن أن يعزز من إمكانية إعادة استخدام الشيفرة وصيانتها۔ إتقان هذه الأنواع يتيح تعريفات أنواع أكثر قوة وأمانًا، مما يمكّن من تطوير فعّال۔

عامل keyof في TypeScript

عامل keyof في TypeScript يُستخدم لاسترجاع جميع أسماء الخصائص لنوع الكائن۔ باستخدام هذا المعامل، يمكنك الحصول على مفاتيح نوع الكائن كنوع اتحاد۔ هذا مفيد للغاية لكتابة كود آمن من حيث النوع۔

الاستخدام الأساسي

1interface Person {
2    name: string;
3    age: number;
4    email: string;
5}
6
7// Use keyof to get the property names of Person
8type PersonKeys = keyof Person; // "name" | "age" | "email"

مثال على الاستخدام

  1. استخدامه في معاملات الدوال

    يمكنك استخدام keyof لتعريف دالة تعتمد أنواعها على خصائص محددة لكائن۔

1function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
2    return obj[key];
3}
4
5const person: Person = { name: "Alice", age: 30, email: "alice@example.com" };
6const name = getProperty(person, "name"); // type is string
7const age = getProperty(person, "age");   // type is number
  1. تعزيز قيود الأنواع

    باستخدام keyof، يمكنك التأكد من أن المفاتيح الممررة إلى دالة يتم التحقق منها في وقت الترجمة۔

1// Passing an invalid property name results in an error
2const invalid = getProperty(person, "invalidKey"); // Error

الملخص

  • يُستخدم معامل keyof لاسترداد جميع أسماء الخصائص لنوع الكائن۔
  • يمكنك الحصول على أسماء الخصائص كنوع اتحاد، مما يحقق كود آمن من حيث النوع۔
  • باستخدامه في معاملات الدوال، يمكنك تقييد الدالة لقبول أسماء الخصائص الصالحة فقط۔

بهذه الطريقة، يعزز معامل keyof سلامة الأنواع في TypeScript ويساعدك على كتابة كود أكثر قوة۔

يمكنك متابعة المقالة أعلاه باستخدام Visual Studio Code على قناتنا على YouTube.۔ يرجى التحقق من القناة على YouTube أيضًا.۔

YouTube Video