إصدار TypeScript: 2.3.2
الشفرة
// example.js
var Person = function (firstNameOrPojo, lastName) {
if (typeof firstNameOrPojo === "string") {
this.firstName = firstNameOrPojo;
this.lastName = lastName;
} else {
return new Person(firstNameOrPojo.firstName, firstNameOrPojo.lastName);
}
};
Person.prototype.greet = function greet() {
return `Hello, I am ${this.firstName} ${this.lastName}.`;
};
var fred = new Person({firstName: "Fred", lastName: "Flintstone"});
console.log(fred.greet());
سلوك متوقع:
أتوقع أن يقوم tsc
بتجميع هذا الكود بدون أخطاء أو تحذيرات ، خاصة بالنظر إلى أن النوع الذي يتم إرجاعه يطابق دائمًا النوع المتوقع.
في JavaScript ، يمكن لدالة المُنشئ إرجاع كائن. عند الانتهاء من ذلك ، يصبح الكائن المرتجع نتيجة تعبير new
بالكامل (راجع الخطوة 3 في وثائق MDN لعامل التشغيل الجديد ).
نظرًا لأنني مهتم بالأنواع ، يمكنني أن أرى سبب تردد مترجم TypeScript في دعم هذا الالتواء في لغة JavaScript. بعد كل شيء ، يجب أن يتحقق المترجم من أن القيمة التي تم إرجاعها صراحةً هي نفس النوع الذي سيتم إرجاعه من المنشئ لو أنه أعاد undefined
(الحالة المعتادة). أعتقد أنه يجب دعم هذا ، لأن:
هذه تقنية JavaScript مفيدة وشائعة
يعمل الكود أعلاه بشكل جيد في Node.js وفي المتصفح:
$ node example.js
Hello, I am Fred Flintstone.
السلوك الفعلي:
يصدر tsc
خطأ عند التحقق من هذا الرمز:
$ tsc --allowJs --checkJs --outDir ./dist example.js
example.js(8,16): error TS2350: Only a void function can be called with the 'new' keyword.
يتم التعرف على النوع بشكل صحيح بالفعل ، بغض النظر عما تقوم بإرجاعه ؛ يعرف المترجم أنه يستخدم نوع الإرجاع عند استدعائه كوظيفة ، ونوع المثيل عند استخدامه كمنشئ. الخطأ هو ما يجب معالجته لملف .js. لا يزال النمط غير مسموح به لملف .ts (نظرًا لأننا أخطأنا في الجانب المحافظ هناك).
+1
خاصةً الآن بعد أن أصبح لدينا Proxy
، هناك سلوكيات لطيفة يمكننا تنفيذها من خلال إعادة وكيل بدلاً من مثيل الفئة مباشرةً. لكن هذا لن يكون ممكنًا ما لم نتمكن من استنتاج أو تحديد نوع إرجاع المُنشئ.
إذا كنت تستطيع أن تضع
get(target, name) {}
و
set(target, name, value) {}
داخل مُنشئ الفئة لتجاوز عوامل تعيين الخاصية لـ (أي جميع خصائص) Object / Array ، حسنًا ... لن تكون جافا سكريبت قصيرة.
[وإلا ستكفي إعادة الوكيل الجديد مع وظائف المعالج.]
التعليق الأكثر فائدة
+1
خاصةً الآن بعد أن أصبح لدينا
Proxy
، هناك سلوكيات لطيفة يمكننا تنفيذها من خلال إعادة وكيل بدلاً من مثيل الفئة مباشرةً. لكن هذا لن يكون ممكنًا ما لم نتمكن من استنتاج أو تحديد نوع إرجاع المُنشئ.