泛型函数中没有类型参数的泛型类

时间:2015-07-22 00:35:02

标签: generics typescript

在Typescript中有没有办法捕获没有类型参数的泛型类?我本质上是在尝试创建一个程序样式映射函数,该函数在我的程序中对集合类进行操作,如

interface Collection<T> {
    ...
}

function map<T, U, V extends Collection>(collection:V<T>, fn:(e:T) => U):V<U> {
    ....
}

但这不起作用,因为编译器要我在地图的通用列表中的Collection上放置一个类型参数。

基本上我希望类型检查器知道如果我在List<T>上调用它,我会找回List<U>;在Set<T>上调用它,我得到Set<U>;这可能吗?

由于

1 个答案:

答案 0 :(得分:1)

这是我对此的看法......

function map<T, U, V extends Collection<any>>(collection: V, fn:(e:T) => U) : Collection<U> {
    return null;
}

妥协一:您无法在T中重复使用V extends Collection<any>类型。理想情况下,您会使用T而不是any

妥协二:我们从函数返回不太具体的Collection<U>。理想情况下,您接受一般类型并返回特定类型,因此这是一种妥协。

没有妥协版本。你需要一个in类型和一个out类型,你需要一个泛型类,所以你可以在方法类型参数中重用类类型:

class Mapper<T, U> {
    map<TIn extends Collection<T>, TOut extends Collection<U>>(collection: TIn, fn:(e:T) => U) : TOut {
        return null;
    }
}