typescript - 如何根据泛型函数的泛型参数获取正确的返回类型
问题描述
如何获得函数的正确返回类型,其中返回类型取决于泛型参数?
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 目前在类型系统中缺乏对大多数高级类型类型的支持,这是您在泛型函数类型上表示操作所需要的。所以简短的回答是“你不能这样做,对不起”。
解决方法往往涉及手动指定您希望通用的具体类型,或者通过模拟一些运行时效果来说服编译器进行所需的分析。从您的示例代码中很难说出您的确切用例是什么,因此以下解决方法看起来很愚蠢,但对于您的实际情况,它可能会起作用。
对于前一种手动指定事物的情况,您的示例代码将变得相对无趣:
type T1 = { a: number };
对于假装具有运行时代码的后一种情况,您可以执行以下操作:
const t1 = true as false || f1(null! as number);
type T1 = typeof t1; // {a: number}
我对true
具有 type的编译器撒了谎,false
这意味着在运行时表达式t1
只会短路并且永远不会被调用。但是在编译时,编译器认为它是,因此期望的类型将是所需的。true
f1()
false || f1(someNumber)
t1
{a: number}
有一个建议允许您使用类型查询运算符typeof
来处理任何表达式,并且在实现该功能的世界中,您只需编写
type T1 = typeof f1(123);
并且没有发出任何运行时代码......但是该提案被拒绝了,因此上面的代码是它的解决方法。
无论如何,对不起,我没有更好的答案给你。希望这有帮助;祝你好运!
推荐阅读
- android - 从 iPhone 拍摄的照片在 Android 手机上旋转 90 度
- php - Opencart 2.x - 客户组 ID 返回为 0
- wordpress - 将此视频右对齐
- java - 如何将第一个图像从 ArrayList 设置为 imageView
- android-studio - Search-Everywhere in Android Studio (IntelliJ) 使搜索文件变得多余?
- apache-nifi - 如何远程访问 NiFi?
- python - 使用 ConnectionPatch 在 imshow 热图之间创建链接
- bash - 打印两个模式之间的所有行,独占,仅第一个实例(在 sed、AWK 或 Perl 中)
- javascript - 在 node.js 中需要 mocha 测试文件导致 TypeError: describe is not a function
- sql-server - 在过程中使用动态 sql 将数据插入模式表