【发布时间】:2022-12-21 12:47:24
【问题描述】:
假设我有通用功能
function example<T>(a: T, b: number): SomeType<T> {
// code goes here
}
但是,为了争论起见,我不知道 example 是否在第一个或第二个参数的类型上是泛型的,或者它可能是具有两个类型参数的泛型。我的目标是确定带有参数元组 [string, number] 的 example 实例化的返回类型。 (所以最好有类似InstantiatedReturnType<F, ParamTuple>的东西,这样在这种情况下InstantiatedReturnType<typeof example, [string, number]>就是SomeType<string>。)我已经验证typeof example确实扩展了类型(...args: [string, number]) => any,但我无法找到一种方法来提取具有此参数元组类型的实例化的返回类型。特别是,如果我采用函数类型 typeof Example 和 (...args: [string, number]) => any 的交集,它的 ReturnType< > 等于 any 或 unknown ,具体取决于我在交集中列出两种类型的顺序。另外,因为函数类型在它们的参数中是逆变的,所以我尝试使用这两种类型的并集 ReturnType< >,但这也没有帮助。欢迎任何建议或指导。
(我不知道模板结构的观点是,我没有能够说出 ReturnType<typeof example<string>> 的信息,因为与参数 [string, number] 匹配的实例化实际上可能是 example<number>,因为 example 实际上是通用的第二个参数类型,并在第一个参数中显式为字符串。用例是我得到一个对象,其值是我可能想调用的替代函数,其中一些可能是通用的,我正在选择一个基于匹配我拥有的参数元组类型的调用。这部分工作——我可以成功地提取键(作为一个具体类型,只有一个字符串居民),其值是一个(可能是通用的)函数,可在元组类型上调用我得到的参数的一部分,但我还需要表达调用将产生的返回类型,我似乎无法管理它。)
更新:this playground 中有一个我试图完成的精简示例。它显示了选择正确的密钥,以及一次获取“匹配实例化”的返回类型的不成功尝试。
【问题讨论】:
-
您无法执行纯类型级别的操作来获得此信息;该语言缺乏真正的高级类型,因此无法表达这一点。值级别中有 some support for higher order function inference,但如果您的用例没有 minimal reproducible example,则很难知道它是否有效。你能提供一个吗?
-
@jcalz 感谢您的观看;发布了一个示例,我希望它能更清楚地说明我正在尝试做什么。
-
我想不出任何可用的方法来做到这一点,抱歉。没有higher kinded types我认为这是不可能的。您想要一个说“不,这不能完成”的答案以及来源吗?或者您是否在寻找(糟糕的)解决方法,涉及手动执行编译器无法自动执行的操作?
-
好吧,如果不是太麻烦的话,我当然不介意看到最不可怕的解决方法......但是我没有在玩具示例中添加的一个功能是该对象也可能具有显式功能,可以想象这可能是比赛。我会更新这个例子。
-
This 是我能想到的最不糟糕的解决方法,您可以在其中手动拼出从输入到输出的类型逻辑。您是否希望将其写在答案中,或者它的用处不足以值得我努力解释吗?
标签: typescript generics return-type