Typescript 如何将类型与引擎盖下的泛型函数关联

Typescript 如何将类型与引擎盖下的泛型函数关联,typescript,typescript-generics,Typescript,Typescript Generics,我有一个类(例如“Collection”),它知道它使用的是什么类型(例如“DBType”),该类在构造函数中得到一个泛型函数(例如“Transform”),该函数获取DBType的子类型,并基于该子类型返回另一个类的实例。当用户使用一些参数调用collection的方法时,collection可以确定哪个DBType子类型将重定向到transform函数 如果我将子类型DBType单独传递给transfrom,它工作得很好,但我被困在类中。我似乎找不到解决办法,我该怎么做。也许这是typesc

我有一个类(例如“Collection”),它知道它使用的是什么类型(例如“DBType”),该类在构造函数中得到一个泛型函数(例如“Transform”),该函数获取DBType的子类型,并基于该子类型返回另一个类的实例。当用户使用一些参数调用collection的方法时,collection可以确定哪个DBType子类型将重定向到transform函数

如果我将子类型DBType单独传递给transfrom,它工作得很好,但我被困在类中。我似乎找不到解决办法,我该怎么做。也许这是typescript的一个限制


我在文章中举了一个简单的例子,这应该足够了。感谢您的帮助。

问题的根源在于您使用的是
ReturnType
,并且转换函数是通用的,并且具有重载
ReturnType
无法处理这两种情况,这就是您得到错误结果的原因。您要寻找的正确逻辑大致如下:

type TranslateDoc<T> = T extends TSomeDoc ? SomeDoc<T>
                     : T extends TOtherDoc ? OtherDoc<T>
                     : T

// TEST TRANSFORM
function transform<T extends TSomeDoc | TOtherDoc | Partial<TCountDoc>>(doc: T): TranslateDoc<T> {

据我所知,没有办法使用高阶泛型(将
TranslateDoc
generic以类指定其参数的方式传递给类)

如果您能够给出更好的变量名,那么这个问题很难理解(尤其是它们应该与类匹配)这样会更容易理解。据我所知,您正在为转换函数使用重载,这与
ReturnType
类型不太匹配。(它只给出最后一个泛型的结果)但几乎可以肯定的是,有另一种方法可以完成您要做的事情。@Tadhgmandald Jensen谢谢,修复了。非常感谢,但我正在寻找一种考虑到每个系列独特功能的解决方案。遗憾的是,没有办法将类型与引擎盖下的泛型函数相关联;对HKT(更高种类的类型)以及新的但有希望的实现要点有一个特性要求。
// second generic isn't used, relies specifically on the transform function only.
declare class TCollection<Doc, Fn extends typeof transform = typeof transform> {
    constructor(transform: Fn);

    findOne<T extends Partial<Doc>>(doc: T): TranslateDoc<T>;
}