我不知道如何解释这一点,也不知道如何在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()
方法调用之后推断TFrom
和TTo
,否则,它现在工作的唯一方法是将类型作为参数传递给Mapper
构造函数,如下所示:
const personInstance = new Mapper<typeof obj, Person>().from(obj1).to(Person).transform()
有什么方法可以实现这样的目标吗?
我能想到的唯一方法是强制from
和to
方法返回另一个正确类型的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
游乐场