在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>
;这可能吗?
由于
答案 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;
}
}