【发布时间】:2019-03-15 22:42:50
【问题描述】:
我有一组谓词进入我们将调用的函数searchForAcceptableNumber。
searchForAcceptableNumber(arrayOfNumbers: number[], ...isNumberAcceptablePredicates: Array<(aNumber: number) => boolean>): number[] {
const acceptableNumbers: number[] = [];
const isNumberAcceptablePredicate: (aNumber: number) => boolean = (aNumber: number) => {
const isLabelAcceptableReducer = (accumulator, currentValue) => accumulator && currentValue(aNumber);
return isNumberAcceptablePredicates.reduce(isLabelAcceptableReducer);
};
arrayOfNumbers.forEach((aNumber: number) => {
if (isNumberAcceptablePredicate(aNumber)) {
acceptableNumbers.push(aNumber);
}
});
return acceptableNumbers;
}
你明白了。本质上它会迭代,一切都很好......除了isNumberAcceptablePredicate不断收到(aNumber: number) => (aNumber: number) => boolean类型的错误。我可以摆脱这种类型,它会全部编译并正常工作。奇怪的是,如果我在调试会话期间将鼠标悬停在isNumberAcceptablePredicate 上,它会说它确实是(aNumber: number) => boolean 类型。
这不一定是代码破坏,也就是说,我最终将这个谓词传递给其他需要(aNumber: number) => boolean 类型的函数,所以它确实引入了代码破坏和这个额外的限制。我确定我错过了一些荒谬的东西,我就是不知道是什么。
【问题讨论】:
-
只需将初始值传递给
reduce:return isNumberAcceptablePredicates.reduce(isLabelAcceptableReducer, true);,这样如果数组isNumberAcceptablePredicates包含一个元素(函数),结果将是true(布尔值)而不是数组中的(唯一)函数。 -
祝福你,善良的陌生人。
-
顺便说一句,您可以使用
filter而不是forEach进行实际过滤:return arrayOfNumbers.filter((aNumber: number) => isNumberAcceptablePredicate(aNumber));。这样你就不需要数组acceptableNumbers -
我会做得更好:
arrayOfNumbers.filter((aNumber) => isNumberAcceptablePredicates.every((pred) => pred(aNumber)));
标签: javascript typescript reducers