【发布时间】:2019-01-15 08:26:55
【问题描述】:
typescript 中有一个名为 ReturnType<TFunction> 的功能,它允许您推断特定函数的返回类型,就像这样
function arrayOf(item: string): string[] {
return [item]
}
但是,我在使用泛型函数时遇到了问题:
function arrayOf<T>(item: T): T[] {
return [item]
}
type R = ReturnType<typeof arrayOf> // R = {}[]
type R = ReturnType<typeof arrayOf<number>> // syntax error
// etc.
使用来自Typescript ReturnType of generic function 的最佳答案,我已经尝试过:(顺便说一句,这不是重复的,它是不同的,因为解决方案和问题确实适用于这种情况)
function arrayOf<T>(x: T): T[] {
return [x];
}
type GenericReturnType<R, X> = X extends (...args: any[]) => R ? R : never;
type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = never
我还尝试了以下方法:
type GenericReturnType<TGenericParameter, TFunction> = TFunction extends (...args: any[]) => infer R ? R : never;
type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
还有
type GenericReturnType<TGenericParameter, TFunction> = TFunction extends <T>(...args: any[]) => infer R ? R : never;
type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
和
type GenericReturnType<TGenericParameter, TFunction> = TFunction extends <T extends TGenericParameter>(...args: any[]) => infer R ? R : never;
type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
还有这个
type GenericReturnType<TGenericParameter, TFunction> = TFunction extends (arg: TGenericParameter) => infer R ? R : never;
type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
还有这个
type GenericReturnType<TGenericParameter, TFunction> = TFunction extends <U extends TGenericParameter>(arg: U) => infer R ? R : never;
type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
还有
type x = (<T>(item: T) => T[]) extends <T>(arg: T) => infer R ? R : never // x = {}[]
最后
type x = (<T>(item: T) => T[]) extends (arg: number) => infer R ? R : never // x = {}[]
但它们都没有产生非常想要的number[]类型
所以,我的问题是,在给定泛型参数的类型的情况下,有没有办法创建类似于内置 ReturnType 的东西,它适用于具有泛型参数的函数? (又名上述问题的解决方案)
【问题讨论】:
标签: javascript typescript types