جافاسكريبت - إعادة تسمية متغير الخصائص المتبقية عند تفكيك الكائن في تايب سكريبت
تعديل:
لقد فتحت مشكلة تتعلق بهذا على جيتهاب: https://github.com/Microsoft/TypeScript/issues/21265
يبدو أن{ ...other: xother }ليس جافاسكريبت صالحًا، ولا تايبسكريبت، ولا ينبغي حتى أن يتم تجميعه.
السؤال الأصلي:
لنفترض المثال التالي:
const values = { a: "1", b: "2", c: "3", d: "4" };
const { a: va, b: vb, ...other } = values;
حيث يتم تعيين اسم متغير جديد va للخاصية a.
هل من الصواب، وفقًا لمواصفات TypeScript، القيام بنفس الشيء مع الخصائص المتبقية ...other? شيء مثل:
const { a: va, b: vb, ...other: vother } = values;
أعلم أنه يعمل، لقد اختبرته (اختبار عبر الإنترنت). لكن لا أستطيع أن أجد أين تم تعريفه للقيام بذلك.
أمثلة المستندات التي تشير إلى إعادة تسمية الخصائص دائماً تعرض الحالة "العادية": دليل TypeScript - إعلانات المتغيرات. وتشير قواعد النحو في المواصفة إلى BindingPattern الذي لم يتم وصفه (أو ربما قد فوتت) في المواصفة: مواصفة TypeScript.
انطباعي الأول هو أنه ليس مفيدًا جدًا لأن ...other هو بالفعل اسم متغير مخصص. لكنه يعمل. وأنا فضولي لمعرفة مكان تعريفه بالضبط أو إذا كان مجرد حالة نادرة تعمل (أفترض أنه ليس كذلك).
الإجابة رقم 1
رابط الدليل الذي ذكرته يغطي معظم السيناريوهات الموجودة في مثالك تحت التفكيك، لكن أعتقد أن الحالة التي يغطيها لم تُغطَّ بشكل صريح (فقط بشكل ضمني).
الميزة الخاصة التي تشير إليها (أعتقد) هي مزيج من:
يمكنك إنشاء متغير للعناصر المتبقية في كائن باستخدام الصياغة
...:
و
يمكنك أيضًا إعطاء أسماء مختلفة للخصائص:
لا يعطي الدليل مثالًا حيث يتم استخدام كلاهما، كما هو موضح أدناه. الجزء المثير للاهتمام في هذا الاستخدام المدمج هو أن الرمز ...other في الواقع لا يعني أي شيء ولا يتم الإشارة إليه أبدًا (أو يمكن الإشارة إليه). في النسخة "العاملة" من المثال أدناه، بدون السطر الذي يسبب الخطأ، لا يظهر رمز other في الناتج على الإطلاق.
إليك المثال المختصر:
const values = { a: "1", b: "2", c: "3", d: "4" };
const { a: one, ...other: twoThreeFour } = values;
console.log(other); // ERROR there is no variable 'other'
console.log(a, twoThreeFour); // OK
والنسخة بدون الخطأ - جافاسكريبت المحوَّلة لا تحتوي على أي إشارة إلى other في أي مكان في الكود:
const values = { a: "1", b: "2", c: "3", d: "4" };
const { a: one, ...other: twoThreeFour } = values;
console.log(a, twoThreeFour); // OK
هناك مشكلة تتعلق بتحسين وضوح استخدام عناصر الباقي فيما يتعلق بالتفكيك في مواصفات اللغة الأساسية.
