2012-10-09 66 views
31

如何將方法添加到基本類型,比如說Array?在全局模塊中這將被識別在TypeScript中擴展數組

interface Array { 
    remove(o): Array; 
} 

但是在哪裏把實際執行?

+0

非常簡單的解決方案,我已經在這裏回答 - http://stackoverflow.com/questions/14867649/adding-a-property-to-array-in-typescript/33573875#33573875 – Vukasin

回答

42

可以使用原型來擴展陣列:

interface Array<T> { 
    remove(o: T): Array<T>; 
} 

Array.prototype.remove = function (o) { 
    // code to remove "o" 
    return this; 
} 
+1

@FrancoisVanderseypen可能是一種痛苦,我建議你不要嘗試。這裏提出的方式比較容易。但如果你很好奇:http://stackoverflow.com/a/14001136/340760 – BrunoLM

+0

它應該是'interface Array {remove(o):T []; }'帶泛型的新版本 –

+0

如果模塊是外部的,則不起作用。 –

5

從打字稿1.6,你可以在「原生地」延長像內置類型的任意表達式。

What's new in TypeScript

打字稿1.6增加了對延伸的計算一個構造函數任意表達式 類的支持。這意味着現在可以在類聲明中擴展內置類型 。

該類的擴展子句先前需要指定的類型引用爲 。它現在接受一個表達式,可選的後跟一個 類型參數列表。表達式的類型必須是一個構造函數 函數類型,其中至少有一個構造體簽名的 數類型參數與 extends子句中指定的類型參數數相同。匹配結構 簽名的返回類型是類實例類型 繼承的基本類型。實際上,這允許在extends子句中指定真實類和「類」 表達式。

// Extend built-in types 

class MyArray extends Array<number> { } 
class MyError extends Error { } 

// Extend computed base class 

class ThingA { 
    getGreeting() { return "Hello from A"; } 
} 

class ThingB { 
    getGreeting() { return "Hello from B"; } 
} 

interface Greeter { 
    getGreeting(): string; 
} 

interface GreeterConstructor { 
    new(): Greeter; 
} 

function getGreeterBase(): GreeterConstructor { 
    return Math.random() >= 0.5 ? ThingA : ThingB; 
} 

class Test extends getGreeterBase() { 
    sayHello() { 
     console.log(this.getGreeting()); 
    } 
} 
+1

這會導致問題,因爲'[]'操作符無法按預期運行。 http://stackoverflow.com/questions/33947854/class-extended-from-built-in-array-in-typescript-1-6-2-does-not-update-length-wh –

+0

@AndrewShepherd非常好的捕獲。 – Alex

23

declare global似乎是票據爲打字稿2.1。請注意,Array.prototype的類型爲any[],因此如果您希望檢查函數實現的一致性,最好自己添加一個泛型類型參數。

declare global { 
    interface Array<T> { 
    remove(elem: T): Array<T>; 
    } 
} 

if (!Array.prototype.remove) { 
    Array.prototype.remove = function<T>(elem: T): T[] { 
    return this.filter(e => e !== elem); 
    } 
} 
3
class MyArray<T> extends Array<T> { 
    remove: (elem: T) => Array<T> = function(elem: T) { 
     return this.filter(e => e !== elem); 
    } 
} 
let myArr = new MyArray<string>(); 
myArr.remove("some"); 

這對我的作品與打字稿V2.2.1!