打字稿:声明和实现柯里化方法

Typescript: declaring and implementing a curried Method

在下面的骨架中class

class Iterable<A> {

    filter( filter: ( value: A ) => boolean ): Iterable<A> { ... }

    map<B>( f: ( value: A, index?: number ) => B ): Iterable<B> { ...}

    collect = <B>( filter: ( value: A ) => boolean ) => ( mapper: ( value: A ) => B ): Iterable<B> => { ... }

}

有一个咖喱 属性 collect 是这样实现的

collect = <B>( filter: ( value: A ) => boolean ) => ( mapper: ( value: A ) => B ): Iterable<B> => {
    return this.filter( filter ).map( mapper )
}

这个 属性 基本上是一个柯里化函数,它将两个函数作为参数并且 return 是一个 Iterable<B>。对于 this,作为 Iterable<A>,可以按以下方式使用:

const it: Iterable<string> = this.collect<string>( f => true )( ( v: A ) => v.toString() )

现在,我想将此 属性 转换为 class 方法 但我找不到正确的语法


解决方案:(参见@JLRishe 和@NitzanTomer 的回答)我进行了显式类型声明:

collect<B>(filter: (value: A) => boolean): (mapper: (value: A) => B) => Iterable<B> {
    return (mapper: (value: A) => B) => this.filter(filter).map(mapper);
}

你可以这样实现:

collect<B>(filter: (value: A) => boolean) {
    return (mapper: (value: A) => B) => this.filter(filter).map(mapper);
}

怎么样

collect<B>(filter: (value: A) => boolean) {
    return (mapper: (value: A) => B): Iterable<B> => {
        return this.filter(filter).map(mapper);
    };
}