يدعم ES6 توريث الصفيف ، لكن هذا لا ينعكس في ملف تعريف TypeScript (lib.es6.d.ts).
تقوم دوال المصفوفة مثل "filter" و "slice" بإرجاع مصفوفة من الفئة الفرعية ، لذلك يجب ترجمة ما يلي في TypeScript:
class MyArray extends Array {
get size() { return this.length; }
}
var x = new MyArray(10).slice();
x.size;
يجب أن تعود الدالات "reverse" و "concat" و "slice" و "splice" و "filter" بالنوع "this".
تقوم وظيفة "الخريطة" بإرجاع مثيل من النوع الفرعي أيضًا ، لكنني لا أعرف كيف يمكن تمثيل ذلك في TypeScript ، لأنها تتطلب معلمة عامة في نوع الإرجاع ، شيء مثل:
map<U>(callback: (value: T, index: number, array: this) => U): this<U>
هناك مشكلة أخرى وهي المنشئات الثابتة لفئة Array ، يجب أن يتم تجميع هذا أيضًا:
var x = MyArray.of(1,2,3);
var y = MyArray.from([1,2,3]);
x.size;
y.size;
هناك أيضًا بعض التعقيدات الإضافية المضافة بواسطة species Symbol ، والتي يمكن استخدامها لتغيير توقيع النوع
class MyArray2 extends Array {
static get [Symbol.species]() { return Array; }
}
يقوم كل من Chrome و Node.js بالفعل بتنفيذ ميزات وراثة الصفيف الموضحة هنا.
سيكون هذا أمرًا صعبًا ، لأن TypeScript لا يسمح حاليًا بإعادة تحديد فترات زمنية للأدوية على متعدد الأشكال this
. انظر # 6223 (والتي يمكن اعتبارها خدعة).
تصبح المشكلة إذا قمت بإدخال فتحة عامة مختلفة في فئة فرعية ، فكيف يعمل متعدد الأشكال this
؟ على سبيل المثال ، تقوم بإنشاء فئة فرعية تتعامل فقط مع مصفوفات من المصفوفات ، حيث تم استخدام T
بهذه الطريقة T[][]
. لكن الخانة العامة في Array
's this
ستكون T[]
، كيف يمكنك التعبير عن ذلك بطريقة تعمل دائمًا؟
هناك المزيد من الأمثلة في المشكلة المذكورة أعلاه بالإضافة إلى الأماكن التي ينهار فيها هذا متعدد الأشكال عند دمجه مع الأدوية الجنيسة.
مشكلة "الخريطة" هي في الواقع نفس المشكلة التي تمت مناقشتها في "متعدد الأشكال" هذا "و" Generics "، ولكن يمكن أن تعمل جميع طرق Array الأخرى بشكل صحيح بمجرد إرجاع" this ".
وتنتج الطريقتان Array.from و Array.of مشكلة منفصلة ، من المستحيل أيضًا تمثيلها باستخدام بناء جملة TypeScript الحالي بقدر ما أعرف ، لأن واجهة ArrayConstructor يجب أن تكون قادرة على الإشارة إلى "هذا" من Array واجهه المستخدم.
يمكن حل الدوال الثابتة بجعل Array
فئة. المشكلة هي أننا بحاجة إلى طريقة لوصف المُنشئ القابل للاستدعاء (https://github.com/Microsoft/TypeScript/issues/183) ، حيث يمكن أيضًا استدعاء Array
كدالة. للأسف ، توقف هذا الاقتراح في TC39 ، ولكن يمكننا عمل نسخة منه للإعلانات المحيطة. أعتقد أنه يجب تتبع هذا بشكل منفصل.
بالنسبة للباقي ، يمكن إضافة this
بدلاً من T[]
. أعتقد أن sort
يقوم بهذا بالفعل.
التعليق الأكثر فائدة
يمكن حل الدوال الثابتة بجعل
Array
فئة. المشكلة هي أننا بحاجة إلى طريقة لوصف المُنشئ القابل للاستدعاء (https://github.com/Microsoft/TypeScript/issues/183) ، حيث يمكن أيضًا استدعاءArray
كدالة. للأسف ، توقف هذا الاقتراح في TC39 ، ولكن يمكننا عمل نسخة منه للإعلانات المحيطة. أعتقد أنه يجب تتبع هذا بشكل منفصل.بالنسبة للباقي ، يمكن إضافة
this
بدلاً منT[]
. أعتقد أنsort
يقوم بهذا بالفعل.