typescript - Yerel JavaScript dizisini genişlet


JS yerel fonksiyonundan bir sınıf miras almak için herhangi bir yol var mı?

Örneğin, benim böyle bir JS fonksiyonum var:

function Xarray()
{
    Array.apply(this, arguments);
    //some stuff for insert, add and remove notification
}
Xarray.prototype = new Array();

Bunu Typescript'e çevirmeyi denedim ama başaramadım!!

export class Xarray implements Array {
}

Derleyici bana tüm Array arayüzü özelliklerini tanımlamamı istiyor. Eğer bu Xarray.prototype=new Array(); koduna ihtiyacım olduğunu biliyorsam, TS'de Array'i genişletmem gerekiyor.

TS'de JS yerel nesnesi nasıl genişletilir?

Cevap #1

TypeScript 1.6 ile başlayarak, Array türünü genişletebilirsiniz, bkz. TypeScript'teki Yenilikler

İşte bir örnek:

class MyNewArray<T> extends Array<T> {
    getFirst() {
        return this[0];
    }
}

var myArray = new MyNewArray<string>();
myArray.push("First Element");
console.log(myArray.getFirst()); // "First Element"

Eğer hedef ES5 veya daha düşük sürüme ise, o zaman aşağıdaki kodu kullanın:

class MyNewArray<T> extends Array<T> {
    constructor(...items: T[]) {
        super(...items);
        Object.setPrototypeOf(this, MyNewArray.prototype);
    }

    getFirst() {
        return this[0];
    }
}

Bunun neden gerekli olduğunu burada daha fazla okuyun.

Cevap #2

Mevcut arabirimler gibi Array’den miras almanın bir yolu olduğunu sanmıyorum,

export class Xarray implements Array {

}

Bir fonksiyon oluşturmalı ve onu prototipiyle birlikte miras almalısınız. Typescript de bunu kabul edecektir, bu Javascript'e benzer.

function Xarray(...args: any[]): void; // required in TS 0.9.5
function Xarray()
{
    Array.apply(this, arguments);
   // some stuff for insert, add and remove notification
}
Xarray.prototype = new Array();

GÜNCELLEME: Bu konu iyi bir şekilde tartışıldı ve jqfaq.com sitesinde bunun için en iyi çözüm sağlandı.

//a dummy class it to inherite array.
class XArray {
    constructor() {
        Array.apply(this, arguments);   
        return new Array();
    }
    // we need this, or TS will show an error,
    //XArray["prototype"] = new Array(); will replace with native js arrray function
    pop(): any { return "" };
    push(val): number { return 0; };
    length: number;
}
//Adding Arrray to XArray prototype chain.
XArray["prototype"] = new Array();

//our Class
class YArray extends XArray {
///Some stuff
}

var arr = new YArray();
//we can use the array prop here.
arr.push("one");
arr.push("two");

document.writeln("First Elemet in array : " + arr[0]);
document.writeln("</br>Array Lenght : " + arr.length);

Umarım bu sana yardımcı olur!!!

İlgili makaleler