考虑以下的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中有类似内容吗?
答案 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岁的人轻易阅读:)
<强>更新强>
这将为您提供所需的结果!
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)