Guy*_*uff 5 javascript types typescript
打字稿中有一个名为的功能ReturnType<TFunction>,它允许您推断特定函数的返回类型,如下所示
function arrayOf(item: string): string[] {
return [item]
}
Run Code Online (Sandbox Code Playgroud)
但是,我在将它与通用函数一起使用时遇到问题:
function arrayOf<T>(item: T): T[] {
return [item]
}
type R = ReturnType<typeof arrayOf> // R = {}[]
type R = ReturnType<typeof arrayOf<number>> // syntax error
// etc.
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
我还尝试过以下方法:
type GenericReturnType<TGenericParameter, TFunction> = TFunction extends (...args: any[]) => infer R ? R : never;
type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
Run Code Online (Sandbox Code Playgroud)
也
type GenericReturnType<TGenericParameter, TFunction> = TFunction extends <T>(...args: any[]) => infer R ? R : never;
type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
Run Code Online (Sandbox Code Playgroud)
和
type GenericReturnType<TGenericParameter, TFunction> = TFunction extends <T extends TGenericParameter>(...args: any[]) => infer R ? R : never;
type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
Run Code Online (Sandbox Code Playgroud)
还有这个
type GenericReturnType<TGenericParameter, TFunction> = TFunction extends (arg: TGenericParameter) => infer R ? R : never;
type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
Run Code Online (Sandbox Code Playgroud)
和这个
type GenericReturnType<TGenericParameter, TFunction> = TFunction extends <U extends TGenericParameter>(arg: U) => infer R ? R : never;
type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
Run Code Online (Sandbox Code Playgroud)
也
type x = (<T>(item: T) => T[]) extends <T>(arg: T) => infer R ? R : never // x = {}[]
Run Code Online (Sandbox Code Playgroud)
最后
type x = (<T>(item: T) => T[]) extends (arg: number) => infer R ? R : never // x = {}[]
Run Code Online (Sandbox Code Playgroud)
但它们都没有产生人们非常想要的类型number[]
所以,我的问题是,在给定通用参数的类型的情况下,有没有什么方法可以创建类似于ReturnType内置函数的东西,该函数适用于具有通用参数的函数?(又名上述问题的解决方案)
我和你有同样的问题,在无数次解决方法不起作用之后,我发现了一个有点“黑客”的方法。但是,这可能并不适合所有情况:
与马特给出的答案类似,重点是有一个虚拟函数,但不重写它。不要编写函数的虚拟重写,而是编写一个返回函数的虚拟用法的虚拟函数。然后,使用以下命令获取结果类型ReturnType:
function arrayOf<T>(item: T): T[] {
return [item];
}
const arrayOfNumber = () => arrayOf<number>(1);
type N = ReturnType<typeof arrayOfNumber>;
Run Code Online (Sandbox Code Playgroud)
从TS 3.7开始,除非我没有正确地进行研究,否则如果不找到解决方法,仍然不可能达到预期的结果。希望我们能得到类似这样的东西:
function arrayOf<T>(item: T): T[] {
return [item];
}
type N = GenericReturnType<typeof arrayOf>; // N<T>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4129 次 |
| 最近记录: |