Typescript: Mendukung nilai-nilai yang dikembalikan dari fungsi konstruktor

Dibuat pada 19 Mei 2017  ·  3Komentar  ·  Sumber: microsoft/TypeScript

Versi TypeScript: 2.3.2

Kode

// 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());

Perilaku yang diharapkan:

Saya mengharapkan tsc untuk mengkompilasi kode ini tanpa kesalahan atau peringatan, terutama mengingat tipe yang dikembalikan selalu cocok dengan tipe yang diharapkan.

Dalam JavaScript, dimungkinkan bagi fungsi konstruktor untuk mengembalikan objek. Ketika ini selesai, objek yang dikembalikan menjadi hasil dari seluruh ekspresi new (lihat langkah 3 dalam dokumentasi MDN ini

Memperhatikan jenis, saya dapat melihat mengapa compiler TypeScript ragu-ragu untuk mendukung kekhasan bahasa JavaScript ini. Bagaimanapun, kompilator harus memverifikasi bahwa nilai yang dikembalikan secara eksplisit adalah tipe yang sama yang akan dikembalikan dari konstruktor seandainya mengembalikan undefined (kasus biasa). Saya rasa ini harus didukung, karena:

  1. TS mengklaim sebagai superset dari JS.
  2. Ini adalah teknik JavaScript yang berguna dan populer

    Kode di atas berjalan dengan baik di Node.js dan di browser:

$ node example.js
Hello, I am Fred Flintstone.

Perilaku sebenarnya:

tsc mengeluarkan kesalahan saat memeriksa kode ini:

$ 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

Komentar yang paling membantu

+1

Terutama sekarang setelah kita memiliki Proxy , ada perilaku bagus yang dapat kita terapkan dengan mengembalikan proxy alih-alih instance kelas secara langsung. Tapi itu tidak akan mungkin kecuali kita bisa menyimpulkan atau menentukan tipe kembalian konstruktor.

Semua 3 komentar

Jenisnya sebenarnya sudah diketahui dengan benar, apa pun yang Anda kembalikan; kompilator tahu untuk menggunakan tipe kembalian saat dipanggil sebagai fungsi, dan tipe instans ketika digunakan sebagai konstruktor. kesalahan adalah apa yang perlu ditangani untuk file .js. polanya masih tidak diizinkan untuk file .ts (karena kami melakukan kesalahan di sisi konservatif di sana).

+1

Terutama sekarang setelah kita memiliki Proxy , ada perilaku bagus yang dapat kita terapkan dengan mengembalikan proxy alih-alih instance kelas secara langsung. Tapi itu tidak akan mungkin kecuali kita bisa menyimpulkan atau menentukan tipe kembalian konstruktor.

jika Anda bisa menempatkan
get(target, name) {}
dan
set(target, name, value) {}
di dalam konstruktor kelas untuk menimpa operator penugasan properti untuk (semua properti dari) Object / Array, maka yah ... javascript tidak akan gagal.
[Jika tidak, mengembalikan Proxy baru dengan fungsi handler sudah cukup.]

Apakah halaman ini membantu?
0 / 5 - 0 peringkat