ES6 mendukung pewarisan Array, tetapi ini tidak tercermin dalam file deklarasi TypeScript (lib.es6.d.ts).
Fungsi array seperti 'filter' dan 'slice' mengembalikan array subclass, jadi berikut ini harus dikompilasi dalam TypeScript:
class MyArray extends Array {
get size() { return this.length; }
}
var x = new MyArray(10).slice();
x.size;
Fungsi 'reverse', 'concat', 'slice', 'splice', 'filter' harus dikembalikan dengan tipe 'this'.
Fungsi 'map' mengembalikan sebuah instance dari subtipe juga, tetapi saya tidak tahu bagaimana hal itu dapat direpresentasikan dalam TypeScript, karena akan membutuhkan parameter generik dalam tipe kembalian, seperti:
map<U>(callback: (value: T, index: number, array: this) => U): this<U>
Masalah lainnya adalah konstruktor statis kelas Array, ini juga harus dikompilasi:
var x = MyArray.of(1,2,3);
var y = MyArray.from([1,2,3]);
x.size;
y.size;
Ada juga beberapa detail tambahan yang ditambahkan oleh Simbol @
class MyArray2 extends Array {
static get [Symbol.species]() { return Array; }
}
Chrome dan Node.js sudah mengimplementasikan fitur pewarisan array yang ditampilkan di sini.
Ini akan menjadi sulit, karena TypeScript saat ini tidak mengizinkan penempatan ulang generik pada polimorf this
. Lihat # 6223 (di mana masalah ini dapat dianggap sebagai penipuan).
Masalahnya menjadi jika dalam subclass Anda memperkenalkan slot generik yang berbeda, bagaimana cara kerja polimorfik this
? Misalnya Anda membuat subclass yang hanya berurusan dengan array array, di mana T
generik digunakan dengan cara ini T[][]
. Tetapi slot umum di Array
this
adalah T[]
, bagaimana Anda mengungkapkannya dengan cara yang selalu berhasil?
Ada lebih banyak contoh dalam masalah yang disebutkan di atas serta di mana polimorfik ini rusak bila dikombinasikan dengan obat generik.
Masalah dengan 'peta' memang sama dengan yang dibahas dalam "Polimorfik 'ini' dan Generik", tetapi semua metode Array bermasalah lainnya dapat bekerja dengan benar hanya dengan mengembalikan 'ini'.
Dan metode Array.from dan Array.of menghasilkan masalah terpisah, yang juga tidak mungkin direpresentasikan dengan sintaks TypeScript saat ini sejauh yang saya tahu, karena antarmuka ArrayConstructor harus dapat merujuk ke 'ini' dari Array antarmuka.
fungsi statis dapat diselesaikan dengan membuat Array
kelas. Masalahnya adalah kita perlu memiliki cara untuk mendeskripsikan konstruktor yang dapat dipanggil (https://github.com/Microsoft/TypeScript/issues/183), karena Array
juga dapat disebut sebagai fungsi. sayangnya proposal ini terhenti di TC39, tetapi kami dapat melakukan versinya untuk deklarasi ambient. Saya pikir ini harus dilacak secara terpisah.
selebihnya, menambahkan this
sebagai ganti T[]
seharusnya dapat dilakukan. Saya yakin sort
sudah melakukan ini.
Komentar yang paling membantu
fungsi statis dapat diselesaikan dengan membuat
Array
kelas. Masalahnya adalah kita perlu memiliki cara untuk mendeskripsikan konstruktor yang dapat dipanggil (https://github.com/Microsoft/TypeScript/issues/183), karenaArray
juga dapat disebut sebagai fungsi. sayangnya proposal ini terhenti di TC39, tetapi kami dapat melakukan versinya untuk deklarasi ambient. Saya pikir ini harus dilacak secara terpisah.selebihnya, menambahkan
this
sebagai gantiT[]
seharusnya dapat dilakukan. Saya yakinsort
sudah melakukan ini.