2017-07-25 72 views
0

我想學習TypeScript,並且需要一些關於實現泛型集合類型的建議。我把字典和HashSet放在另一個問題中,在這裏我希望對我的列表類型提供任何建議。TypeScript通用集合:列表

特別是ForEach-Operation看起來有點奇怪。我想我在這裏發現了另一個問題,並且如果迭代早期停止或完成,則通過返回真或假來「改善」以給出反饋。

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迭代依賴的接口從另一個文件:

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

你會用我的列表,像這樣的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(s){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