List TypeScript泛型集合:列表
我正在尝试学习TypeScript,需要一些关于实现泛型集合类型的建议。我把字典和哈希集放在另一个问题中,这里我想听听关于列表类型的建议 尤其是ForEach操作看起来有点奇怪。我想我在这里的另一个问题中发现了这一点,并且通过返回true或false来“改进”,以便在迭代提前停止或完成时提供反馈List TypeScript泛型集合:列表,list,typescript,collections,List,Typescript,Collections,我正在尝试学习TypeScript,需要一些关于实现泛型集合类型的建议。我把字典和哈希集放在另一个问题中,这里我想听听关于列表类型的建议 尤其是ForEach操作看起来有点奇怪。我想我在这里的另一个问题中发现了这一点,并且通过返回true或false来“改进”,以便在迭代提前停止或完成时提供反馈 import { IForEachFunction } from "./IForEachFunction" export class List<T> { private _item
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;
}
}
从“/IForEachFunction”导入{IForEachFunction}
导出类列表{
私有_项:数组;
公共构造函数(){
此项。_项=[];
}
public get Count():number{
返回此项。\u items.length;
}
公共项目(索引:编号):T{
返回此项。_项目[索引];
}
公共附加值(值:T):无效{
此._项目推送(值);
}
公共移除(索引:编号):无效{
此项为拼接(索引1);
}
公共删除(值:T):无效{
设index=this.\u items.indexOf(value);
此.RemoveAt(索引);
}
公共ForEach(回调:IForEachFunction):布尔值{
对于(此项的常量元素){
if(回调(元素)==false){
返回false;
}
}
返回true;
}
}
ForEach迭代依赖于另一个文件的接口:
export interface IForEachFunction<T> {
(callback: T): boolean | void;
}
导出接口IForEachFunction{
(回调:T):布尔值| 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
let myList:List=newlist();
let completed:boolean=myList.ForEach(xyz=>{
//用xyz做点什么
return false;//中止迭代
返回true;//继续下一个元素
});
if(completed)//我们可以看到迭代过程中发生了什么
我认为这还不错,但我希望你能提供任何意见。我不确定我是否正确地使用了===。
我很想知道的另一个问题是:如何使用接口IForEachFunction定义函数?我并没有明显地“重用”那个接口,我总是声明一个匿名方法,如上所示。如果我想调用一个具有接口定义的方法,这可能吗
谢谢!
Ralf我看到的一个问题是您有一个接口实例:
callback: IForEachFunction<T>
但你只回过一次电话。在接口中应该有call callback()方法:
callback.callback()
另外,您的代码看起来像是受到了C#或Java的启发。在TypeScript中,通常只使用数组。这简化了某些代码构造。FWIW,与您的
ForEach
方法所做的相同。我会坚持使用普通数组,而不是编写包装器。这个问题似乎有点过于宽泛,因为我不知道如何给出一个不解决所有不同问题的自包含答案:您的ForEach函数看起来很好。您可以使用==
。可以使用如下接口定义函数:var-forEachFunc:IForEachFunction=function{return!!s;}
。方法和属性通常以小写字母开头。我假设您实现List
类是为了您自己的充实,而不是为了在“现实世界”中使用,因为正如其他人所说,在大多数情况下,您最好使用js数组。不,IForEachFunction
不包含名为callback
的方法。它是一个类似于可调用函数的接口,带有一个名为callback
的参数。仔细看一下括号的位置。他的混淆表明@Ralf的声明比它需要的更加混淆:callback
参数不是回调;它只是一个类型为T
的值;没有其他属性的可调用接口本质上只是一种函数类型。我建议像导出类型IForEachFunction=(t:t)=>boolean | void相反,代码>的作用大致相同,而且更清晰。
callback.callback()