我希望能够为一个非常通用的函数添加别名,并指定泛型参数的 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
答案 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
好的,这是我能做的最好的事情。祝你好运!