Function TypeScript是否允许类型别名指定泛型?
我希望能够对非常通用的函数进行别名,并指定部分通用参数,从而创建同一函数的不太通用的版本。如下所示:Function TypeScript是否允许类型别名指定泛型?,function,typescript,generics,type-alias,Function,Typescript,Generics,Type Alias,我希望能够对非常通用的函数进行别名,并指定部分通用参数,从而创建同一函数的不太通用的版本。如下所示: function veryGeneric<X, Y>(someParam: Y): { result: X } { // ... } type LessGeneric = typeof veryGeneric<X, string> const lessGeneric: LessGeneric = veryGeneric declare function track
function veryGeneric<X, Y>(someParam: Y): { result: X } {
// ...
}
type LessGeneric = typeof veryGeneric<X, string>
const lessGeneric: LessGeneric = veryGeneric
declare function track<T = {}, P = {}>(trackingInfo?: TrackingInfo<T, P>, options?: Options<Partial<T>>): Decorator
这有可能吗
我知道我可以创建一个包装器函数,但我更希望不必再次指定参数类型(而且不必支付另一个函数调用的开销,即使它很小,也是一个额外的好处)
这是我正在处理的真实例子。给定函数声明(来自),如下所示:
function veryGeneric<X, Y>(someParam: Y): { result: X } {
// ...
}
type LessGeneric = typeof veryGeneric<X, string>
const lessGeneric: LessGeneric = veryGeneric
declare function track<T = {}, P = {}>(trackingInfo?: TrackingInfo<T, P>, options?: Options<Partial<T>>): Decorator
您可以这样做:
const lessGeneric: <X>(someParam: string) => { result: X } = veryGeneric;
或者,从有效分析条目中提取:
type PartiallySpecifiedTrack<T = {}> = <P = {}>(
trackingInfo?: TrackingInfo<T, P>,
options?: Options<Partial<T>>)
=> Decorator
const trackSpecificToOurAnalyticsSchema:
PartiallySpecifiedTrack<ValidAnalyticsEntries> = track;
好吧,这是我能做的最好的了。祝你好运 要定义泛型类型别名,可以定义描述函数签名的接口:
interface VeryGeneric<X, Y> {
(someParam: Y): { result: X };
}
type Foo = { foo: number };
type LessGeneric<X = Foo> = VeryGeneric<X, string>;
const lessGeneric: LessGeneric = veryGeneric;
interface VeryGeneric{
(someParam:Y):{result:X};
}
类型Foo={Foo:number};
LessGeneric型=VeryGeneric型;
const lessGeneric:lessGeneric=veryGeneric;
这有什么意义?X
generic约束没有用处,为什么会有呢?请分享你的真实代码我不认为有必要知道X
的作用对于这个例子,我添加了一个简单的例子。如果你能更好地描述你的问题,你会得到更好的帮助,在这种情况下,它没有得到很好的解释。如果您只在函数中使用X
,并且它不是参数或返回类型,则无需将其作为通用约束。我理解这一点,但我的印象是,/…
部分清楚地表明,有些细节与当前问题无关。我现在添加了一个真实的例子。您会使用相同的函数(track
),还是实际实现了trackspecifictoouranalyticschema
?谢谢您的建议!确实没有包装器函数,所以这无疑是一个进步,但我最重要的原因是,我不想再次详细说明所有参数。谢谢。我还没有找到比我上面的答案更详细的东西。谢谢!我仍然需要使用包装器函数,以便让不太通用的版本的用户指定X
,但至少消费者可以重新使用接口并生成具有自定义默认值的函数。你可以在这里找到这些例子
const anotherTrack: PartiallySpecifiedTrack<{ foo: string }> = track;
declare const trackingInfo: TrackingInfo<{ foo: string }, {bar: number}>
anotherTrack(trackingInfo); // okay
interface VeryGeneric<X, Y> {
(someParam: Y): { result: X };
}
type Foo = { foo: number };
type LessGeneric<X = Foo> = VeryGeneric<X, string>;
const lessGeneric: LessGeneric = veryGeneric;