2016-04-23 11 views
0

.ToList()メソッドをTypescriptのArray<T>クラスに追加する方法。私は最終的に次の結果を期待しています。`.ToList()`メソッドをTypescriptの `Array <T>`クラスに追加するには?

let nums:List<number> = [1,2,3,5,6].ToList(); 
let strs:List<string> = ["abc", "cdf", "efg"].ToList(); 

git repoが利用可能であれば、共有してください。

次のエラーが発生しています。

enter image description here

インタフェースをエクスポートせずに、私は

enter image description here

+0

Listインターフェイスとは何ですか?あなたのコードで何かカスタム? – toskv

+0

はい..リストは私自身の実装です。 –

+0

スクリーンショットに配列とリストが赤く表示されるのはなぜですか? –

答えて

0

あなたはJavascriptの方法、それを行うことができ、Array.prototypeをにその機能を追加することで、次のエラーを取得しています。しかし、型の安全性が必要な場合は、型アサーションを少しだけ行う必要があります。

アレイのプロトタイプに関数を追加します。

(<any>Array.prototype).ToList = function() { 
    return this.join(","); 
} 

活字体はあなたがそれらを再宣言し、独自の機能を追加することにより、インターフェイスを拡張することができます:

interface Array<T> { 
    ToList:() => string 
} 

アサートをその配列ますToListを呼び出す場合は、インターフェイスの種類:

let a = [1,2,3,5,6].ToList(); 
0

typescriptのすべてのインターフェイスが拡張可能であるため、Arrayのインターフェイスは拡張可能です。簡単な例:

list.d.ts:

interface Array<T> { 
    ToList():List; 
} 

list.ts:それを使用して

/// <reference "./list.d.ts" /> 
Array.prototype.ToList = function() { 
    return this.toString(); 
} 

let arr = [1,2,3] 
let list = arr.ToList(); 
+0

私は同じことをしました。しかし、エラーを取得します。私はFYRのスクリーンショットを添付しました。 –

+0

どのタイプのタイスクリプトを使用していますか?私は上記の[Typescript playground](https://www.typescriptlang.org/play/)でテストし、正しくコンパイルしました。 – ArcSine

+0

ああ、私は問題を見る、あなたが得るエラーは、エクスポートのためです。インターフェイスをエクスポートする場合は、別の.d.tsファイルを定義し、それを含める必要があります。 – ArcSine

0

ジャストんではないexportインターフェースとあなたコードはエラーなしでコンパイルされます。

class List<T> { 
    constructor(items: T[]) {} 
} 

interface Array<T> { 
    ToList():List<T>; 
} 

Array.prototype.ToList = function() { 
    return new List(this); 
}; 

モジュールから文字通り何をエクスポートすることは、コンパイルを壊し、そしてOPのエラーが発生するように見えますTypeScript playground

EDIT#1

上でそれを試してみてください。私はマイクロソフトに問題を提出しました。参照:https://github.com/Microsoft/TypeScript/issues/8278

EDIT#2

さて、それは(文字通り何をエクスポートする)上記の例に輸出文を追加すると、OPの誤差が生じることが判明したので。マイクロソフトの人たちは私たちの問題に答えましたが、Arrayインタフェースのタイプ情報を正しく指定していないことが分かりました。だからここでそれを行う方法です:

class List<T> { 
    constructor(items: T[]) {} 
} 

declare global { 
    interface Array<T> { 
     ToList():List<T>; 
    } 
} 

Array.prototype.ToList = function() { 
    return new List(this); 
}; 

export default List; 
+0

は、自分のコードの 'class'の前に' export'のためにエラーが発生します。 'export'がなければ、別の' ts'ファイルでそのクラスを使うことはできません。 –

+0

@NatarajanGanapathiこれは、タイスクリプトのバグのようです。私は問題を提出しました(私の更新を見てください)。 –

0

私は答えを得ました。

declare global { 
    interface Array<T> { 
     ToList(): List<T>; 
    } 
} 

Array.prototype.ToList = function() { 
    return new List(this); 
}` 

export class List<T> { 
    constructor(private array: T[] = []) {} 

    public Add(item: T): List<T> { 
     this.array.push(item); 
     return this.array.ToList(); 
    } 
} 
関連する問題