gpt4 book ai didi

javascript - TypeScript - 通用函数的 ReturnType 不起作用

转载 作者:搜寻专家 更新时间:2023-10-30 21:47:46 25 4
gpt4 key购买 nike

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 的东西吗?给定通用参数的类型,哪个适用于具有通用参数的函数? (也就是上述问题的解决方案)

最佳答案

我和你有同样的问题,在无数次解决方法都不起作用之后,我发现了一个有点“hack”的问题。但是,这可能并不适合所有情况:

与马特给出的答案类似,重点是有一个虚拟函数,但没有重写它。与其编写函数的虚拟重写,不如编写一个返回函数虚拟用法的虚拟函数。然后,使用 ReturnType 获取结果类型:

function arrayOf<T>(item: T): T[] {
return [item];
}

const arrayOfNumber = () => arrayOf<number>(1);
type N = ReturnType<typeof arrayOfNumber>;

TS 3.7 开始,除非我没有做正确的研究,否则在没有找到解决方法的情况下仍然不可能达到预期的结果。希望我们能得到如下所示的内容:

function arrayOf<T>(item: T): T[] {
return [item];
}

type N = GenericReturnType<typeof arrayOf>; // N<T>

关于javascript - TypeScript - 通用函数的 ReturnType 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51740472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com