我想學習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定義一個函數?我沒有真正「重複使用」那個界面,我總是聲明一個匿名方法,如上所示。如果我想調用具有接口定義的方法,那有可能嗎?
謝謝! 拉爾夫
FWIW,['Array#every'](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/every)與您的'ForEach'方法做同樣的事情。我會堅持一個普通的數組,而不是寫一個包裝。 – Saravana
這個問題似乎有點過於寬泛,因爲我無法弄清楚如何給出一個不包含所有不同事物的獨立答案:您的ForEach函數看起來很好。你使用'==='很好。你可以用如下的接口定義來定義一個函數:'var forEachFunc:IForEachFunction = function(s){return !! s; }'。方法和屬性通常以小寫字母開頭。我假設你正在爲自己的豐富實現'List'類,而不是在「現實世界」中使用,因爲正如其他人所說的,在大多數情況下你最好使用js數組。 –
jcalz