
يسعدنا اليوم أن نعلن عن توفر مرشح الإصدار (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;
يجب أن يكون هذا السلوك بديهيًا - يمكنك فقط الحصول على خاصية من نوع الاتحاد إذا كان من المعروف أنها موجودة في كل نوع من أنواع الاتحاد.
ماذا عن ، بدلاً من الوصول إلى الخصائص ، نحن نتعامل مع أنواع الاتصال؟ حسنًا ، عندما يكون لكل نوع توقيع واحد بالضبط مع معلمات متطابقة ، تعمل الأشياء فقط ويمكنك استدعاء هذه الأنواع.
type CallableA = (x: boolean) => string; type CallableB = (x: boolean) => number; type CallableUnion = CallableA | CallableB; declare let f: CallableUnion; let x = f(true);
ومع ذلك ، كان هذا التقييد في بعض الأحيان ، حسنا ، مفرط التقييد.
type Fruit = "apple" | "orange"; type Color = "red" | "orange"; type FruitEater = (fruit: Fruit) => number;
مثال سخيف ورسالة خطأ رديئة جانبا ، يجب أن يكون كل من FruitEater
s و ColorConsumer
قادرين على أخذ السلسلة "orange"
، وإرجاع number
أو string
.
في TypeScript 3.3 ، لم يعد هذا خطأ.
type Fruit = "apple" | "orange"; type Color = "red" | "orange"; type FruitEater = (fruit: Fruit) => number;
في 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 => {
على الرغم من أننا سنستمر في تحسين التجربة هنا ، إلا أن هذا أكثر قدرة في تطبيق 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;
مشاهدة ملف تزايدي للمشاريع المركبة في - --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