在方法调用后使泛型类"re-infer"泛型参数



我不知道如何解释这一点,也不知道如何在Typescript中调用此功能,但让我们来看一个例子。

假设我们可以使用下面的类将一个对象映射到另一个

class Mapper<TFrom, TTo> {
from(obj: unknown): this // implementation does not matter for now
to(type: Class<TTo>/*this should receive a constructable type signature*/): this
transform(): TTo
}

在方法调用而不是new初始化之后,我们如何推断TFrom和TTo?

class Person {
name: string
}
const personObj = {name: 'test'}
const personInstance = new Mapper().from(obj1).to(Person).transform()

为了使上面的代码在personInstance上具有正确的类型Person,我需要typescript来分别在from()to()方法调用之后推断TFromTTo,否则,它现在工作的唯一方法是将类型作为参数传递给Mapper构造函数,如下所示:

const personInstance = new Mapper<typeof obj, Person>().from(obj1).to(Person).transform()

有什么方法可以实现这样的目标吗?

我能想到的唯一方法是强制fromto方法返回另一个正确类型的Mapper实例,而不是this,但这需要from方法也有一个泛型类型参数,这会变得很混乱:

from<TFromFn>(obj: TFromFn){
// ...
return this as unknown as Mapper<TFromFn, unknown>
}

谢谢你读到这里!

游乐场链接

从问题的细节来看,似乎并不需要泛型类型TFrom,因为您在任何地方都没有使用它。

您认为这些方法也需要是泛型的,这是正确的。如果我们只有TTo类型,那么只有to需要是泛型的。

class Mapper<TTo> {
from(obj: unknown): this {
return {} as any
}
to<TTo>(type: new () => TTo): Mapper<TTo> {
return {} as any
}
transform(): TTo {
return {} as any  
}
}

personInstance现在将具有正确的类型。

class Person {
name!: string
}
const personObj = {name: 'test'}
const personInstance = new Mapper().from(personObj).to(Person).transform()
//    ^? const personInstance: Person

游乐场

最新更新