在Expressioncript

时间:2016-10-02 17:50:53

标签: javascript linq typescript

考虑以下的Typescript函数:

getPeople(): Person[] {
    return model.people;
}

我想用嵌入式过滤器实现它,它将基于我想作为参数传递的Expression,或多或少像这样:

getPeopleBy(expression): Person[] {
    return model.people.filter(expression);
}

var filteredPeople = getPeopleBy(p => p.age < 30);

使用Linq和C#,我可以通过接受具有此语法Expression<Func<EcommerceProduct, bool>> filter

的参数来实现

Typescript / Javascript中有类似内容吗?

2 个答案:

答案 0 :(得分:2)

无视(最初的答案 - 留在这里让人们了解演变过程):

是的,在C#中你可以做到这一点,但你必须记住TypeScript带有一些借用C#的糖语法,JavaScript是它自己的动物。

为了传递一个表达式,你需要记住一个lamba表达式只是一个函数,所以在JS中你只需要键,值(对象)和函数(简单,对吧?)。

所以要实现你想要的代码应该是这样的:

getPeopleBy(expression: Function): Person[] {
    return model.people.filter(expression);
}

var filteredPeople = getPeopleBy((p: Person) => { return p.age < 30 });

PS:我还建议您将功能名称更改为 getPeopleWith 吗?

正如您所看到的,从人的角度来看,阅读起来更有意义:

getPeopleWith((p: Person) => { return p.age < 30 });

基本上它可以让年龄小于30岁的人轻易阅读:)

<强>更新

这将为您提供所需的结果!

TypeScript Playground Example

class People {
    private static people: any[] = [];

    static where(expression: (value: any, index?: number, Array?: any[]) => boolean): 
                                                                            any[] {
        return this.people.filter(expression);
    }
}


People.where(p => p.age < 30);

更新2:

TypeScript Playground Example using interface definition for callback

如果您需要编写FluentAPI或更大的内容,并且您厌倦了拖动callbackfn定义,您还可以执行以下操作:

interface IFilter {
    value: any;
    index?: number;
    Array?: any[];
}

class People {
    private static people: any[];

    static where(expression: (IFilter) => boolean): any[] {
        return this.people.filter(expression);
    }
}


People.where(p => p.age < 30);

更新3:

TypeScript Playground with Type Inference

通过使用界面中的模板,你也可以获得很好的IntelliSense:)

interface Person {
    age: number;
}

interface IFilter<T> {
    value: T;
    index?: number;
    Array?: T[];
}

class People {
    private static people: Person[];

    static where(expression: (IFilter: Person) => boolean): any[] {
        return this.people.filter(expression);
    }
}

People.where(p => p.age < 30); 

我希望这些系列更新可以帮助您实现目标。

答案 1 :(得分:0)

查看linq.js,您可以找到更多信息here

有了它,你可以传递一个函数作为参数来用作过滤器。

谷歌搜索我发现还有一个TS库(我看到你正在使用TypeScript),你可以找到它here。我还没有测试过它:))