gpt4 book ai didi

TypeScript:是否可以获取泛型函数的返回类型?

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

我从某个模块中导出了一个函数,如下所示:

export function MyFunc<A>() {
return {
foo: (in: A) => void
}
}

现在,在其他模块中,我希望能够讨论 MyFunc 的不同返回类型。 .因为我没有导出类型,所以我将使用 typeof在给定值 MyFunc 的情况下获得我想要的类型. 理想情况下,我会执行以下操作:

import { MyFunc } from "mymodule";
type MyFuncReturned<A> = ReturnType<typeof MyFunc<A>>;

function foo(): MyFuncReturned<string> {
// ...
}

哼,这行不通; typeof只能传递一个值并且不喜欢我指定该值的通用类型的尝试。

我能做的最好的就是说服 TypeScript 推断特定类型的 MyFunc从我创建的值,然后给它们单独的类型别名,例如:

const myFuncStringReturn = MyFunc<string>();
type MyFuncStringReturn = typeof myFuncStringReturn;

为了避免实际运行 MyFunc只是为了获取类型信息,我可以将其隐藏在函数后面并使用 ReturnType在上面:

const myFuncStringReturn = () => MyFunc<string>();
type MyFuncStringReturn = ReturnType<typeof myFuncStringReturn>;

const myFuncBoolReturn = () => MyFunc<bool>();
type MyFuncBoolReturn = ReturnType<typeof myFuncBoolReturn>;

这给了我一种方式,一次一种类型,讨论 MyFunc 的不同返回类型。 , 但它

  • 涉及要编写的实际运行时代码,TS 可以从中进行推断。
  • 不让我谈论MyFunc在更一般的意义上。

我能想出的唯一“正确”解决方案是在声明 MyFunc 时复制一堆类型信息。 :

export function MyFunc<A>(): MyFuncReturns<A> {
return {
foo: (in: A) => void
}
}

export type MyFuncReturns<A> = {
foo: (in: A) => void
}

但现在随着我的改变MyFunc ,我必须确保保留 MyFuncReturns与它同步。

有什么办法可以得到像 MyFuncReturns<A> 这样的类型吗?鉴于我们的导出值(value) MyFunc ,无需添加运行时代码或添加上面的样板文件?

最佳答案

有人提议允许使用 typeof使用任意表达式来允许诸如获取特定类型参数的泛型函数的返回类型之类的事情(参见 herehere )

今天可行的更通用的解决方法是使用一个通用类,该类的字段绑定(bind)到函数的返回类型。然后我们可以提取类的字段。由于对于类,我们可以在类型表达式中指定泛型类型参数,因此我们可以提取返回类型的泛型形式:

export function MyFunc<A>() {
return {
foo: (os : A) => {}
}
}

class Helper <T> {
Return = MyFunc<T>()
}
type FuncReturnType<T> = Helper<T>['Return']
type ForBool = FuncReturnType<boolean> // {foo: (os: boolean) => void;}
type ForString = FuncReturnType<string> // {foo: (os: string) => void;}

注意 如果您有 A 的约束你需要在 T 上复制那些在 HelperFuncReturnType ,不幸的是,这是不可避免的。

关于TypeScript:是否可以获取泛型函数的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52963637/

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