繁体   English   中英

TypeScript是否允许类型别名指定泛型?

[英]Does TypeScript allow a type alias to specify generics?

我希望能够为非常通用的函数添加别名并指定部分通用参数,从而创建相同函数的不太通用的版本。 类似于以下内容:

function veryGeneric<X, Y>(someParam: Y): { result: X } {
  // ...
}

type LessGeneric = typeof veryGeneric<X, string>
const lessGeneric: LessGeneric = veryGeneric

我希望lessGeneric函数基本上被键入为:

function lessGeneric<X>(someParam: string): { result: X } {
  // ...
}

这有可能吗?

我知道我可以创建一个包装器函数,但我宁愿不必再次指定参数类型(并且不必支付另一个函数调用的开销,即使它很小,也是一个奖励)。


这是我正在处理的真实例子。 给出一个函数声明(来自react-tracking ),如下所示:

declare function track<T = {}, P = {}>(trackingInfo?: TrackingInfo<T, P>, options?: Options<Partial<T>>): Decorator

我希望能够定义一个别名,指定trackingInfo参数的输入,但保留P generic。 即我想要一个基本上键入的别名:

interface ValidAnalyticsEntries {
  page: string
  action: string
}

declare function trackSpecificToOurAnalyticsSchema<P = {}>(trackingInfo?: TrackingInfo<ValidAnalyticsEntries, P>, options?: Options<Partial<ValidAnalyticsEntries>>): Decorator

要定义泛型类型别名,可以定义描述函数签名的接口:

interface VeryGeneric<X, Y> {
    (someParam: Y): { result: X };
}

type Foo = { foo: number };
type LessGeneric<X = Foo> = VeryGeneric<X, string>;

const lessGeneric: LessGeneric = veryGeneric;

你可以这样做:

const lessGeneric: <X>(someParam: string) => { result: X } = veryGeneric;

我只是拼写出所需类型的lessGeneric没有试图迫使打字稿到的类型转换veryGeneric到的类型lessGeneric第一。 但是,没有包装功能。

这对你有用吗? 如果没有,请在您的用例和示例中添加更多详细信息。 具体来说, X参数几乎不可能实现(如何实现得到X类型的值)和Y参数someParam没有做任何事情( someParam参数是Y类型,但没有其他东西使用Y ,所以你不妨只声明someParamany类型而不是使用Y )。

希望有所帮助; 祝好运!


编辑:我对真实示例的建议如下:

const trackSpecificToOurAnalyticsSchema: <P = {}>(
  trackingInfo?: TrackingInfo<ValidAnalyticsEntries, P>,
  options?: Options<Partial<ValidAnalyticsEntries>>)
  => Decorator = track;

或者,从ValidAnalyticsEntries抽象出来:

type PartiallySpecifiedTrack<T = {}> = <P = {}>(
  trackingInfo?: TrackingInfo<T, P>,
  options?: Options<Partial<T>>)
  => Decorator

const trackSpecificToOurAnalyticsSchema: 
  PartiallySpecifiedTrack<ValidAnalyticsEntries> = track;

请注意,在所有这些情况下,您仍然必须至少两次写出函数签名:一次定义完全通用的track() ,一次定义PartiallySpecifiedTrack 但是,如果您愿意,可以将T不同值重新使用PartiallySpecifiedTrack

const anotherTrack: PartiallySpecifiedTrack<{ foo: string }> = track;
declare const trackingInfo: TrackingInfo<{ foo: string }, {bar: number}>
anotherTrack(trackingInfo); // okay

好的,这是我能做的最好的事情。 祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM