定义泛型<T> TOf 以提取另一个泛型 T 使用的泛型 M



我试图定义一个以以下方式使用泛型的函数:

public fetch<M extends Model, T extends Service<M> = Service<M>>(service: string): T {
return this.services[service]<M, T>();
}

,其中Service需要一个通用的M extends Model。现在,TService的扩展,它有一个扩展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<...>。显然,对于相同的输入,任何GenericOfhelper类型都不能给出两个不同的结果。

也就是说,如果你只需要在特定的泛型中使用它,你可以定义像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

相关内容

  • 没有找到相关文章

最新更新