如何将两个lambda表达式与Typescript,
组合在一起C#确实有类Expression-Func来处理lambda表达式,但Typescript没有这个选项。
我有一个函数将lambda表达式传递给func,名为GetCurrentRange
例如this.GetCurrentRange(start, end, x => x.AccountId== Account.id)
和另一个函数添加它的表达式。
result = result.And(x => x.Date >= CurrentStart);
我怎样才能使用Typescript,
确定这里有更多细节
在这里编辑
private GetCurrentRange(start?: Date, end?: Date, activeSpec: (exception: AccountTransaction) => boolean)
{
var result = activeSpec;
/// some code here
result = result (need to add exception here )(x => x.Date >= currentStart);
}
}
return result;
}
public Update(_account: Account, start?: Date, end?: Date): void
{ // some code here
var transactions = Query(this.GetCurrentRange(start, end, x => x.AccountId == _account.id)); }
答案 0 :(得分:1)
我喜欢这个问题......这是一个完整的例子,然后快速解释一下:
class Example {
constructor(
public num: number,
public bool: boolean
) {}
}
var examples: Example[] = [
new Example(5, true),
new Example(5, false),
new Example(6, true),
];
function exampleFilter(arr: Example[], predicate: (x: Example) => boolean) {
var matches: Example[] = [];
for (var i = 0; i < arr.length; i++) {
if (predicate(arr[i])) {
matches.push(arr[i]);
}
}
return matches;
}
function exampleFilter2(arr: Example[], predicate: (x: Example) => boolean) {
var newPredicate = function(x: Example) {
return x.bool && predicate(x);
}
var matches: Example[] = [];
for (var i = 0; i < arr.length; i++) {
if (newPredicate(arr[i])) {
matches.push(arr[i]);
}
}
return matches;
}
var a = exampleFilter(examples, (x) => x.num < 6);
console.log(a);
var b = exampleFilter2(examples, (x) => x.num < 6);
console.log(b);
因此exampleFilter
和exampleFilter2
之间的差异是谓词的扩展,如下所示:
var newPredicate = function(x: Example) {
return x.bool && predicate(x);
}
因此,这是您可以使用的技术来制作您在问题中描述的可修饰项目。
这是一个类的基本示例,它将作为类型为T的数组的通用查询。
class Query<T> {
constructor(private arr: T[], private predicate: (x:T) => boolean) {}
and(predicate: (x:T) => boolean) {
var priorCondition = this.predicate;
this.predicate = (x:T) => {
return priorCondition(x) && predicate(x);
}
return this;
}
toList() {
var matches: T[] = [];
for (var i = 0; i < this.arr.length; i++) {
if (this.predicate(this.arr[i])) {
matches.push(this.arr[i]);
}
}
return matches;
}
}
and
方法只是合并传递的每个谓词。
var q = new Query(examples, (x) => x.num < 6);
q.and((x) => x.bool);
var result = q.toList();
甚至:
var result = new Query(examples, (x) => x.num < 6).and((x) => x.bool).toList();
请注意我在这个区域中已经看过几次的错误......我们现在有一个看似有点像Linq的API,有点像Linq - 但你需要使用ECMAScript 6 generators if you want to actually work like Linq。