Typescript如何组合两个lambda表达式

时间:2015-11-11 20:13:00

标签: lambda typescript

如何将两个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)); }

1 个答案:

答案 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);

因此exampleFilterexampleFilter2之间的差异是谓词的扩展,如下所示:

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