2017-07-25 9 views
0

TypeScriptを学びたいと思っています。ジェネリックコレクションタイプを実装するためのアドバイスが必要です。私は辞書とHashSetを別の質問に入れました。ここで私のリストのタイプについて助言したいと思います。TypeScript Generic Collection:List

特にForEach-Operationは少し奇妙に見えます。私はここで別の質問でそれを見つけたと思うし、反復が早期に中止されたり完了した場合にフィードバックを返すことによってtrueまたはfalseを返すことによって「改善されました」。あなたはこのように私のリストとのForEach-メソッドを使用します

export interface IForEachFunction<T> { 
    (callback: T): boolean | void; 
} 

import { IForEachFunction } from "./IForEachFunction" 

export class List<T> { 
    private _items: Array<T>; 

    public constructor() { 
     this._items = []; 
    } 

    public get Count(): number { 
     return this._items.length; 
    } 

    public Item(index: number): T { 
     return this._items[index]; 
    } 

    public Add(value: T): void { 
     this._items.push(value); 
    } 

    public RemoveAt(index: number): void { 
     this._items.splice(index, 1); 
    } 

    public Remove(value: T): void { 
     let index = this._items.indexOf(value); 
     this.RemoveAt(index); 
    } 

    public ForEach(callback: IForEachFunction<T>): boolean { 
     for (const element of this._items) { 
      if (callback(element) === false) { 
       return false; 
      } 
     } 

     return true; 
    } 
} 

のForEach-繰り返しが別のファイルからインターフェイスに依存している

let myList: List<a_type> = new List<a_type>(); 
let completed: boolean = myList.ForEach(xyz => { 
    // do something with xyz 
    return false; // aborts the iteration 
    return true; // continues with the next element 
}); 
if (completed) // we can see what happened "during" the iteration 

私はこれがあると思います悪くはないが、私はどんな入力をいただければ幸いです。私が正しく使用するかどうかはわかりません。 私が本当に知りたいもう一つの質問:インターフェイスIForEachFunctionを使って関数をどのように定義できますか?私は実際にそのインタフェースを目に見える形で「再利用」していません。私は常に上記のような匿名のメソッドを宣言します。インタフェース定義を持つメソッドを呼びたい場合は可能ですか?

ありがとうございます!私が見 ラルフ

+0

FWIW、['Array#every'](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/every)は、あなたの' ForEach'メソッドと同じことをします。私はラッパーを書くのではなく、普通の配列に固執します。 – Saravana

+0

あなたのForEach関数はうまくいくように見えますが、すべての異なることに取り組まない自己完結型の答えをどのように与えるかわからないので、この質問は少し広すぎます。 '==='の使用は問題ありません。あなたは次のようにインターフェース定義を持つ関数を定義することができます: 'var forEachFunc:IForEachFunction = function {return !! s; } '。メソッドとプロパティは、小文字で始まります。私はあなたが自分の豊かさのために 'List'クラスを実装していると仮定します。他の人が言っているように、ほとんどの場合、js配列を使うほうがよいでしょうから。 – jcalz

答えて

0

一つの問題は、インターフェイスのインスタンスを持っていることです。

callback: IForEachFunction<T> 

これは

callback() 

と呼ばれるメソッドが含まれていますしかし、あなたは一度だけコールバックを呼び出します。

callback.callback() 

また、C#やJavaに触発されているようなコードもあります。 TypeScriptでは、配列を使うことがよくあります。これにより、特定のコード構成が簡単になります。

+0

いいえ、 'IForEachFunction 'には 'callback'という名前のメソッドは含まれていません。 'callback'という名前の*パラメータを持つ呼び出し可能な関数のようなインタフェースです。かっこの配置を注意深く見てください。 – jcalz

+0

彼の混乱は、@ Ralfの宣言が必要以上に混乱していることを示しています: 'callback'パラメータはコールバックではありません。これはちょうど 'T'型の値です。他のプロパティを持たない呼び出し可能なインタフェースは基本的に単なる関数型です。 'export type IForEachFunction =(t:T)=> boolean |のようなものをお勧めします。代わりに、それは多かれ少なかれ同じであり、より明確です。 – jcalz