首页 > 解决方案 > 如何根据泛型函数的泛型参数获取正确的返回类型

问题描述

如何获得函数的正确返回类型,其中返回类型取决于泛型参数?

function f1<T>(o: T) {
  return { a: o }
}

// I was hoping (n: number) would set T to number:
type T1 = typeof f1 extends (n: number) => infer R ? R : never // T1 is unknown

标签: typescript

解决方案


TypeScript 目前在类型系统中缺乏对大多数高级类型类型的支持,这是您在泛型函数类型上表示操作所需要的。所以简短的回答是“你不能这样做,对不起”。


解决方法往往涉及手动指定您希望通用的具体类型,或者通过模拟一些运行时效果来说服编译器进行所需的分析。从您的示例代码中很难说出您的确切用例是什么,因此以下解决方法看起来很愚蠢,但对于您的实际情况,它可能会起作用。

对于前一种手动指定事物的情况,您的示例代码将变得相对无趣:

type T1 = { a: number };

对于假装具有运行时代码的后一种情况,您可以执行以下操作:

const t1 = true as false || f1(null! as number);
type T1 = typeof t1; // {a: number}

我对true具有 type的编译器撒了谎,false这意味着在运行时表达式t1只会短路并且永远不会被调用。但是在编译时,编译器认为它是,因此期望的类型将是所需的。truef1()false || f1(someNumber)t1{a: number}

有一个建议允许您使用类型查询运算符typeof来处理任何表达式,并且在实现该功能的世界中,您只需编写

type T1 = typeof f1(123);

并且没有发出任何运行时代码......但是该提案被拒绝了,因此上面的代码是它的解决方法


无论如何,对不起,我没有更好的答案给你。希望这有帮助;祝你好运!


推荐阅读