Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List TypeScript泛型集合:列表_List_Typescript_Collections - Fatal编程技术网

List TypeScript泛型集合:列表

List TypeScript泛型集合:列表,list,typescript,collections,List,Typescript,Collections,我正在尝试学习TypeScript,需要一些关于实现泛型集合类型的建议。我把字典和哈希集放在另一个问题中,这里我想听听关于列表类型的建议 尤其是ForEach操作看起来有点奇怪。我想我在这里的另一个问题中发现了这一点,并且通过返回true或false来“改进”,以便在迭代提前停止或完成时提供反馈 import { IForEachFunction } from "./IForEachFunction" export class List<T> { private _item

我正在尝试学习TypeScript,需要一些关于实现泛型集合类型的建议。我把字典和哈希集放在另一个问题中,这里我想听听关于列表类型的建议

尤其是ForEach操作看起来有点奇怪。我想我在这里的另一个问题中发现了这一点,并且通过返回true或false来“改进”,以便在迭代提前停止或完成时提供反馈

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()