أنواع الصفوف المطبوع عليها

أفضل طريقة لكتابة tuples في Typescript 4.2 والإصدارات الأحدث

نظرة فاحصة على مجموعات Typescript

كتذكير سريع ، فإن المجموعة في تعريفها الأساسي هي مجرد بنية بيانات تتكون من أجزاء متعددة. في نطاق استخدام المجموعات في لغات البرمجة ، مثل Typescript ، من المهم أيضًا ملاحظة أن البيانات هي الأكثر شيوعًا في الترتيب.

يُظهر مثال بسيط كيف يتم تعريف tuples في Typescript.

// This tuple is defined as a set
// of two numbers.
const scores: [number, number] = [1, 2];

// For comparison, this tuple consists
// of three elements, each of a different
// type. Not that the ordered nature of
// tuples in TS becomes very clear here.
const result: [string, number, boolean] = ["id", 101, false];

// And as a "nice-to-know", you can even
// provide lables for the tuple elements.
// This doesn't have any effect on the typesystem
// itself and only (may) improve documentation.
const output: [id: number, name: string] = [101, "Tom"];

مجموعات مع عناصر اختيارية

نظرًا للتحسن الذي طرأ على "Typescript" بمرور الوقت ، فقد تحسن تطبيق tuples أيضًا. ليس عليك فقط تحديد العناصر التي يجب أن تكون إلزامية. يمكنك الآن أيضًا كتابة العناصر على أنها اختيارية. إذا كنت لا تعرف ، فإن Typescript تستخدم علامة الاستفهام كرمز عام لتحديد العناصر على أنها اختيارية ، مما يعني أنها يمكن أن تكون متاحة في وقت التشغيل ، ولكن ليس من الضروري ذلك.

مثال آخر يوضح ما أعنيه بذلك.

// Similar to our previous example, but in this
// case the the tuple's last element doesn't have
// to be provided (or can be undefined at runtime).
type Tuple = [id: number, name?: string];

const a: Tuple = [101];
const b: Tuple = [42, "Tom"];

بقية العناصر في مجموعات الأنواع

مع عناصر الراحة ، لديك نوع قوي جدًا في متناول اليد يميز جميع العناصر التالية في المجموعة من نوع معين. لنفترض أن لديك مجموعة مكونة من عنصرين وأن العنصر الثاني معرف كعنصر راحة ، يمكنك بعد ذلك توفير 2 + n من العناصر في وقت التشغيل لمتغير المجموعة هذا.

لتضييق نطاق التعريف ، حتى وقت قريب كان هذا العنصر مسموحًا به فقط في نهاية المجموعة. هذا أمر منطقي ، لأن هذا يسمح لك بتوفير أي عدد من العناصر في وقت تشغيل النوع الباقي ، ولكنه سيجعل الأمور معقدة للغاية للتمييز بين عنصر الباقي وعنصر آخر مكتوب آخر.

// This example might be a tuple type
// for a CLI similar to Node.js. The first
// two elements are system-internal.
//
// Starting from the 3rd element, a user can
// provide as much arguments as desired, yet
// we can still cleanly handle it with TS. Nice!
let input: [number, boolean, ...string[]];

// Just to show that we really can provide any
// number of rest elements, including 0.
e = [0, false, "max-cache", "1024", "debug", "false"];
e = [0, false];
e = [0, false, "verbose"];

عنصر البادئة أو الوسط في أنواع الصفوف

من خلال تطوير عنصر الباقي لـ tuples ، يمكنك إنشاء تطبيقات أكثر تعقيدًا منذ إصدار Typescript 4.2. ويجب أن أعتذر هنا: فقط بضع جمل في وقت مبكر ، كتبت كيف أنه من الإلزامي استخدام عنصر الراحة فقط كعنصر آخر. لم يعد هذا التقييد صحيحًا في الواقع بعد الآن منذ Typescript 4.2 ، حيث يمكنك الآن وضع عناصر الراحة في أي مكان تقريبًا في tuple.

ولكن مع وجود قيود قليلة فقط ، توفر Typescript الآن بنية جيدة جدًا لـ tuples المتقدمة. يمكن أن تظهر عناصر الراحة في أي مكان داخل المجموعة طالما أنها تتوافق مع القاعدتين التاليتين

  • لا يتبعه عنصر اختياري
  • لا يوجد عنصر راحة آخر يتبع العنصر الأول

قبل التحدث كثيرًا عن النظرية ، دعنا نرى على سبيل المثال.

// And here comes the fancy part: rest elements
// *not only* at the end of a tuple.
// 
// Note: this example is taken directly from the
// TS documentation. For more details, check out the
// links in the addendum.
let foo: [...string[], number];

foo = [123];
foo = ["hello", 123];
foo = ["hello!", "hello!", "hello!", 123];

let bar: [boolean, ...string[], boolean];

bar = [true, false];
bar = [true, "some text", false];
bar = [true, "some", "separated", "text", false];

// And here's an example that shows how the
// type system would catch your errors:
interface Clown { /*...*/ }
interface Joker { /*...*/ }

let StealersWheel: [...Clown[], "me", ...Joker[]];
//                                    ~~~~~~~~~~ Error!
// A rest element cannot follow another rest element.

let StringsAndMaybeBoolean: [...string[], boolean?];
//                                        ~~~~~~~~ Error!
// An optional element cannot follow a rest element.

العنصر الباقي من هذه المقالة

عند الانتهاء من هذا الدليل المضغوط حول tuples في Typescript ، ألقينا نظرة على التنفيذ الأساسي ثم استعرضنا بعض الأمثلة الأكثر تقدمًا لنرى كيف تسمح Typescript لنظام كتابة مرن للغاية عندما يتعلق الأمر بـ tuples. آمل أن تكون قد استمتعت بالمقال وإذا كنت مهتمًا بمعرفة المزيد ، فراجع المنشورات المقترحة الأخرى أدناه.

الاقتراحات

ذات صلة

ملحق

اللغات