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

时间:2017-09-18 13:50:31

标签: function typescript generics type-alias

我希望能够为一个非常通用的函数添加别名,并指定泛型参数的 part ,从而创建相同函数的不太通用的版本。如下所示:

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 } {
  // ...
}

这有可能吗?

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

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

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

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

interface ValidAnalyticsEntries {
  page: string
  action: string
}

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

2 个答案:

答案 0 :(得分:2)

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

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

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

const lessGeneric: LessGeneric = veryGeneric;

答案 1 :(得分:1)

你可以这样做:

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

我只是拼写出所需类型的lessGeneric,而不是试图强制TypeScript首先将veryGeneric的类型转换为lessGeneric的类型。但是,没有包装函数。

这对你有用吗?如果没有,请在您的用例和示例中添加更多详细信息。具体来说,X参数几乎不可能实现(如何实现实现类型X的值)并且Y参数几乎不执行任何操作({{ 1}}参数的类型为someParam,但没有其他任何内容使用Y,因此您也可以将Y声明为类型someParam而不使用{{ 1}})。

希望有所帮助;祝你好运!

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

any

或者,摘自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()的{​​{1}}重复使用PartiallySpecifiedTrack

PartiallySpecifiedTrack

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