[英]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
,所以你不妨只声明someParam
为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()
,一次定义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.