2012-10-09 15 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句で指定することができます。

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

これはtypescriptですv2.2.1で私の作品!