الإعلان عن TypeScript 3.3 RC

يسعدنا اليوم أن نعلن عن توفر مرشح الإصدار (RC) الخاص بنا من TypeScript 3.3. أملنا هو جمع الملاحظات والقضايا المبكرة لضمان سهولة إصدارنا النهائي واستخدامه على الفور.

الأصل في بلوق

لبدء استخدام RC ، يمكنك الحصول عليها من خلال NuGet ، أو استخدام npm مع الأمر التالي:


npm install -g typescript@rc 

يمكنك أيضًا الحصول على دعم محرر بواسطة



يجب أن يكون TypeScript 3.3 إصدارًا سلسًا للاعتماد ، ولا يحتوي على أي تغييرات فاصل. دعنا نستكشف الجديد في 3.3.


تحسين السلوك لاستدعاء أنواع الاتحاد


عندما يكون لـ TypeScript نوع اتحاد A | B A | B ، يسمح لك بالوصول إلى جميع الخصائص المشتركة لكل من A و B (أي تقاطع الأعضاء).


 interface A { aProp: string; commonProp: string; } interface B { bProp: number; commonProp: number } type Union = A | B; declare let x: Union; x.aProp; // error - 'B' doesn't have the property 'aProp' x.bProp; // error - 'A' doesn't have the property 'bProp' x.commonProp; // okay! Both 'A' and 'B' have a property named `commonProp`. 

يجب أن يكون هذا السلوك بديهيًا - يمكنك فقط الحصول على خاصية من نوع الاتحاد إذا كان من المعروف أنها موجودة في كل نوع من أنواع الاتحاد.


ماذا عن ، بدلاً من الوصول إلى الخصائص ، نحن نتعامل مع أنواع الاتصال؟ حسنًا ، عندما يكون لكل نوع توقيع واحد بالضبط مع معلمات متطابقة ، تعمل الأشياء فقط ويمكنك استدعاء هذه الأنواع.


 type CallableA = (x: boolean) => string; type CallableB = (x: boolean) => number; type CallableUnion = CallableA | CallableB; declare let f: CallableUnion; let x = f(true); // Okay! Returns a 'string | number'. 

ومع ذلك ، كان هذا التقييد في بعض الأحيان ، حسنا ، مفرط التقييد.


 type Fruit = "apple" | "orange"; type Color = "red" | "orange"; type FruitEater = (fruit: Fruit) => number; // eats and ranks the fruit type ColorConsumer = (color: Color) => string; // consumes and describes the colors declare let f: FruitEater | ColorConsumer; // Cannot invoke an expression whose type lacks a call signature. // Type 'FruitEater | ColorConsumer' has no compatible call signatures.ts(2349) f("orange"); 

مثال سخيف ورسالة خطأ رديئة جانبا ، يجب أن يكون كل من FruitEater s و ColorConsumer قادرين على أخذ السلسلة "orange" ، وإرجاع number أو string .


في TypeScript 3.3 ، لم يعد هذا خطأ.


 type Fruit = "apple" | "orange"; type Color = "red" | "orange"; type FruitEater = (fruit: Fruit) => number; // eats and ranks the fruit type ColorConsumer = (color: Color) => string; // consumes and describes the colors declare let f: FruitEater | ColorConsumer; f("orange"); // It works! Returns a 'number | string'. f("apple"); // error - Argument of type '"apple"' is not assignable to parameter of type '"orange"'. f("red"); // error - Argument of type '"red"' is not assignable to parameter of type '"orange"'. 

في TypeScript 3.3 ، تتقاطع معلمات هذه التوقيعات معًا لإنشاء توقيع جديد. في المثال أعلاه ، تتقاطع المعلمات Fruit & Color معًا لمعلمة جديدة من النوع Fruit & Color . Fruit & Color هي في الحقيقة نفس ("apple" | "orange") & ("red" | "orange") التي تعادل ("apple" & "red") | ("apple" & "orange") | ("orange" & "red") | ("orange" & "orange") ("apple" & "red") | ("apple" & "orange") | ("orange" & "red") | ("orange" & "orange") ("apple" & "red") | ("apple" & "orange") | ("orange" & "red") | ("orange" & "orange") . يتبخر كل من هذه التقاطعات المستحيلة ، وتركنا مع "orange" & "orange" الذي هو مجرد "orange" .


لا تزال هناك بعض القيود على الرغم من. يبدأ هذا السلوك الجديد فقط عندما يكون لنوع واحد في الاتحاد أكثر من حمل زائد ، ويكون للنوع الواحد في الاتحاد توقيع عام. وهذا يعني طرق على number[] | string[] number[] | string[] مثل map (وهي عامة) لا تزال غير قابلة للاستدعاء.


من ناحية أخرى ، ستكون طرق مثل forEach الآن قابلة للاستدعاء ، لكن في ظل noImplicitAny وجود أي noImplicitAny قد تكون هناك بعض المشكلات.


 interface Dog { kind: "pupper" dogProp: any; } interface Cat { kind: "kittyface" catProp: any; } const catOrDogArray: Dog[] | Cat[] = []; catOrDogArray.forEach(animal => { // ~~~~~~ error! // Parameter 'animal' implicitly has an 'any' type. }); 

على الرغم من أننا سنستمر في تحسين التجربة هنا ، إلا أن هذا أكثر قدرة في تطبيق TypeScript 3.3 ، وستعمل إضافة تعليق توضيحي واضح على الكتابة.


 interface Dog { kind: "pupper" dogProp: any; } interface Cat { kind: "kittyface" catProp: any; } const catOrDogArray: Dog[] | Cat[] = []; catOrDogArray.forEach((animal: Dog | Cat) => { if (animal.kind === "pupper") { animal.dogProp; // ... } else if (animal.kind === "kittyface") { animal.catProp; // ... } }); 

مشاهدة ملف تزايدي للمشاريع المركبة في - --build --watch


في TypeScript 3.0 ، قدمنا ​​ميزة جديدة لهيكلة الإنشاءات تسمى "المشاريع المركبة". جزء من الهدف هنا هو ضمان قيام المستخدمين بتقسيم المشروعات الكبيرة إلى أجزاء أصغر تبني بسرعة وتحافظ على بنية المشروع ، دون المساس بتجربة TypeScript الحالية. بفضل المشروعات المركبة ، يمكن لـ TypeScript استخدام وضع --build لإعادة ترجمة مجموعة المشاريع والتبعيات فقط. يمكنك أن تفكر في هذا على النحو الأمثل يبني بين المشاريع.


ومع ذلك ، في العام الماضي تقريبًا ، قام فريقنا بشحن --watch وضع --watch المُحسّنة عبر واجهة برمجة التطبيقات الإضافية "البناء" الإضافية. في سياق مشابه ، فإن الفكرة بأكملها هي أن هذا الوضع فقط يعيد فحص وإعادة إرسال الملفات أو الملفات التي تم تغييرها والتي قد تؤثر تبعياتها على فحص النوع. يمكنك أن تفكر في هذا على النحو الأمثل يبني داخل المشروع.


ربما من المفارقات أن بناء المشاريع المركبة باستخدام --build --watch الواقع لم يستخدم هذه البنية التحتية. --build --watch التحديث في أحد المشاريع تحت وضع --build --watch كاملاً لهذا المشروع ، بدلاً من تحديد الملفات التي تأثرت بهذا المشروع.


في TypeScript 3.3 ، --build وضع --watch علامة --watch زيادة مشاهدة الملفات الإضافية أيضًا. هذا يمكن أن يعني أسرع بشكل --build --watch يبني تحت - بناء - --build --watch . في الاختبارات التي أجريناها ، نتج عن هذه الوظيفة تقليل 50٪ إلى 75٪ في أوقات إنشاء أوقات --build --watch الأصلية - --build --watch . يمكنك قراءة المزيد عن طلب السحب الأصلي للتغيير لمعرفة أرقام محددة ، ولكننا نعتقد أن معظم مستخدمي المشروع المركب سيرون انتصارات كبيرة هنا.


ما التالي؟


بعد 3.3 ، يمكنك مراقبة صفحة خريطة الطريق الخاصة بنا لأي عمل قادم.


لكننا نتطلع الآن إلى التعرف على تجربتك مع الصليب الأحمر ، لذلك قدمها الآن واطلعنا على أفكارك!


- دانيال روزنواسر وفريق TypeScript

Source: https://habr.com/ru/post/ar437652/


All Articles