我试图定义一个以以下方式使用泛型的函数:
public fetch<M extends Model, T extends Service<M> = Service<M>>(service: string): T {
return this.services[service]<M, T>();
}
,其中Service
需要一个通用的M extends Model
。现在,T
是Service
的扩展,它有一个扩展Model
的泛型,例如UserService<UserModel>
。
上面的工作,但问题是,是否有一种方法来定义上述函数fetch
,这样我就不必显式地指定M
,例如:
// This is obviously bogus but I think it gets my point across.
public fetch<T extends Service<GenericOf<T>>>(service: string): T {
return this.services[service]<GenericOf<T>, T>();
}
我环顾四周,想象它将是一个实用程序类型的排序,将允许我得到在一个类型中使用的泛型。那么,我是否可以定义一个操作符来提取提供给它的类型的泛型type M = GenericOf<UserService>
?
你不能像你想的那样拥有一个完全通用的GenericOf
类型;考虑这个例子:
type Foo<T> = {foo: T, bar: number}
type Bar<T> = {foo: string, bar: T}
type FooTest = GenericOf<Foo<string>>
type BarTest = GenericOf<Bar<number>>
这里,FooTest
必须是string
,BarTest
必须是number
;但两者都被定义为{foo: string, bar: number}
类型的GenericOf<...>
。显然,对于相同的输入,任何GenericOf
helper类型都不能给出两个不同的结果。
GenericOf
这样的东西:
type FooGenericOf<T extends Foo<any>> = T extends Foo<infer U> ? U : never
type BarGenericOf<T extends Bar<any>> = T extends Bar<infer U> ? U : never
则FooGenericOf<Foo<string>>
为string
,BarGenericOf<Bar<number>>
为number
。