Typescript: دعم إرجاع القيم من وظائف المنشئ

تم إنشاؤها على ١٩ مايو ٢٠١٧  ·  3تعليقات  ·  مصدر: microsoft/TypeScript

إصدار 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 (الحالة المعتادة). أعتقد أنه يجب دعم هذا ، لأن:

  1. تدعي TS أنها مجموعة شاملة من JS.
  2. هذه تقنية 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.
Bug Fixed

التعليق الأكثر فائدة

+1

خاصةً الآن بعد أن أصبح لدينا Proxy ، هناك سلوكيات لطيفة يمكننا تنفيذها من خلال إعادة وكيل بدلاً من مثيل الفئة مباشرةً. لكن هذا لن يكون ممكنًا ما لم نتمكن من استنتاج أو تحديد نوع إرجاع المُنشئ.

ال 3 كومينتر

يتم التعرف على النوع بشكل صحيح بالفعل ، بغض النظر عما تقوم بإرجاعه ؛ يعرف المترجم أنه يستخدم نوع الإرجاع عند استدعائه كوظيفة ، ونوع المثيل عند استخدامه كمنشئ. الخطأ هو ما يجب معالجته لملف .js. لا يزال النمط غير مسموح به لملف .ts (نظرًا لأننا أخطأنا في الجانب المحافظ هناك).

+1

خاصةً الآن بعد أن أصبح لدينا Proxy ، هناك سلوكيات لطيفة يمكننا تنفيذها من خلال إعادة وكيل بدلاً من مثيل الفئة مباشرةً. لكن هذا لن يكون ممكنًا ما لم نتمكن من استنتاج أو تحديد نوع إرجاع المُنشئ.

إذا كنت تستطيع أن تضع
get(target, name) {}
و
set(target, name, value) {}
داخل مُنشئ الفئة لتجاوز عوامل تعيين الخاصية لـ (أي جميع خصائص) Object / Array ، حسنًا ... لن تكون جافا سكريبت قصيرة.
[وإلا ​​ستكفي إعادة الوكيل الجديد مع وظائف المعالج.]

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات