بالتأكيد، في TypeScript يمكنك استخدام تقنية تسمى “index signatures” لتمكين التفويض لخاصية الفهرسة (index property) إلى عضو في الكائن الذي تقوم بتغليفه. في المثال الذي طرحته، تريد استخدام تقنية التفويض هذه لكي تقوم بتغليف كائن MyStringArray
وتمكين استخدام خاصية الفهرسة من الكائن المغلف بدلاً من تنفيذها مباشرة في الكلاس الجديد MyStringArrayWrapper
.
الكود الذي طرحته صحيح بشكل عام، باستثناء الجزء المتعلق بالفهرسة. في TypeScript، لا يمكنك استخدام getter و setter لفهرسة (indexer) بشكل مباشر في الوقت الحالي. ولكن يمكنك استخدام وظيفة اسمها Proxy
لتحقيق هذا الهدف بشكل مرن.
في هذا السياق، يمكنك تعريف Proxy
لكائن MyStringArray
واستخدامه لتفويض الفهرسة. إليك كيف يمكن تحقيق ذلك:
typescriptinterface MyStringArray {
length: number;
clear(): void;
[index: number]: string;
}
class MyStringArrayWrapper implements MyStringArray {
private wrapped: MyStringArray;
constructor(wrapped: MyStringArray) {
this.wrapped = new Proxy(wrapped, {
get(target, prop, receiver) {
if (typeof prop === 'number') {
return target[prop];
} else {
return Reflect.get(target, prop, receiver);
}
},
set(target, prop, value, receiver) {
if (typeof prop === 'number') {
target[prop] = value;
return true;
} else {
return Reflect.set(target, prop, value, receiver);
}
}
});
}
public get length(): number {
return this.wrapped.length;
}
public clear(): void {
this.wrapped.clear();
}
}
// Example usage
const wrappedArray: MyStringArray = {
length: 3,
clear() {
// Implementation
},
0: "foo",
1: "bar",
2: "baz"
};
const wrapper = new MyStringArrayWrapper(wrappedArray);
console.log(wrapper[0]); // Output: "foo"
wrapper[1] = "qux";
console.log(wrapper[1]); // Output: "qux"
هذا الكود يستخدم Proxy
لتفويض الفهرسة من MyStringArrayWrapper
إلى wrapped
، الكائن المراد تغليفه. يقوم المنظور (Proxy) بالتقاط محاولات الوصول والتعديل على الفهرسة وتوجيهها إلى الكائن المغلف بشكل صحيح.
باستخدام هذا النهج، يمكنك الآن استخدام MyStringArrayWrapper
كواجهة للتعامل مع MyStringArray
بدون الحاجة إلى تكرار تعريف الخصائص الأساسية.
المزيد من المعلومات
بالطبع، إليك المزيد من المعلومات حول استخدام Proxy
في TypeScript وكيفية تفويض الفهرسة (indexing) باستخدامه:
-
Proxy في TypeScript:
Proxy
هو نوع جديد في ECMAScript 6 يسمح لك بتعريف سلوك مخصص للعمليات الأساسية مثل الوصول والتعديل والحذف على الخصائص في كائن. يمكن استخدامه لتنفيذ العديد من الأنماط البرمجية المختلفة مثل التفويض والتصفية والتتبع والتحقق من الصلاحية. -
فهرسة (Indexing) في TypeScript:
في TypeScript، يمكنك تعريف فهرس (indexer) في الواجهات (interfaces) لتوفير وصول ديناميكي إلى الخصائص. يسمح لك فهرس الواجهة بالوصول إلى الخصائص باستخدام قيم مفتاحية (keys) من نوع معين (مثل الأعداد أو السلاسل) بدلاً من استخدام اسم الخاصية بشكل ثابت. -
تفويض الفهرسة باستخدام Proxy:
في المثال السابق، استخدمناProxy
لتحقيق تفويض الفهرسة من كلاسMyStringArrayWrapper
إلى كائنwrapped
، الذي يحتوي على الخصائص التي نريد الوصول إليها بواسطة الفهرسة. باستخدام دوال التفويض فيProxy
(مثلget
وset
)، نستطيع تحديد سلوك مخصص لعمليات الوصول والتعديل على الفهرسة. -
الفوائد من استخدام Proxy لتفويض الفهرسة:
- يسمح لك بتجنب تكرار تعريف الخصائص والأساليب في الكلاس الجديد.
- يجعل الكود أكثر مرونة وقابلية للصيانة وإعادة الاستخدام.
- يسمح بتطبيق أنماط التصميم مثل “التفويض” بشكل أكثر فعالية.
-
نصائح عند استخدام Proxy:
- تأكد من تعريف جميع العمليات المطلوبة في دوال التفويض (مثل
get
وset
) بحيث تغطي جميع الحالات الممكنة للوصول والتعديل على الخصائص. - قم بتوثيق السلوك المخصص الذي تم تنفيذه باستخدام
Proxy
لتسهيل فهمه وصيانته في المستقبل.
- تأكد من تعريف جميع العمليات المطلوبة في دوال التفويض (مثل
بهذه الطريقة، يمكنك استخدام Proxy
في TypeScript بشكل فعّال لتفويض الفهرسة وتحقيق التفاعل الديناميكي مع الكائنات المراد تغليفها أو التعامل معها.