首页 > 解决方案 > 可管道函数的打字稿推理

问题描述

我正在开发一个包装数组并创建可管道过滤器函数的类。

但是,Typescript 推理不适用于谓词函数。我认为它与通用范围有关,有没有办法解决这个限制?

class SomeClass<T> {
    constructor(public arr: Array<T>) {}
}

function filter <R> (fn: (r: R) => boolean) {
    return function (obj: SomeClass<R>) : SomeClass<R> {
        return new SomeClass(obj.arr.filter(fn));
    }
} 

/* How to replace i: unknown with i: number? */
let r = filter (i => i > 2) (new SomeClass([1, 2, 3]))
console.log(r);

标签: typescriptgenericsfilterfunctional-programmingpipe

解决方案


您需要将泛型类型传递给函数,还需要使用构造函数初始化一些属性,或者只需将其更改SomeClass为一些泛型的数组T

像这样:

class SomeClass<T> {
    constructor(public arr: Array<T>) {}
}

function filter <R> (fn: (r: R) => boolean) {
    return function (obj: SomeClass<R>) : SomeClass<R> {
        return new SomeClass(obj.arr.filter(fn));
    }
} 

/* How to replace i: unknown with i: number? */
let r = filter<number>(i => i >= 2) (new SomeClass([1, 2, 3]))
console.log(r);

推荐阅读