typescript - 如何在 TypeScript 中获取函数应用程序的类型?
问题描述
如何获取应用于 TypeScript 中参数的泛型函数的类型?
例如,我如何Apply
在下面定义?
declare function f<T>(t: T): T extends number ? boolean : object;
type ResForNumArg = Apply<typeof f, number>; // should be boolean
type ResForStringArg = Apply<typeof f, object>; // should be object
如果没有办法做到这一点,可以通过创建一个类型别名作为函数的类型级版本来解决特定情况下的问题,如下F
所示:
declare function f<T>(t: T): T extends number ? boolean : object;
type ApplyF<T> = T extends number ? boolean : object;
type ResForNumArg = ApplyF<number>; // boolean
type ResForStringArg = ApplyF<object>; // object
但是ApplyF
可能会与打字不同步f
并且很烦人。有没有更好的办法?
更新:这似乎与https://github.com/microsoft/TypeScript/issues/29043有关
解决方案
正如您正确地发现不可能将函数声明用作泛型类型,在没有函数执行的情况下应用泛型是不可能的。我们只能在函数调用期间应用泛型(或从参数推断):
const r1 = f<number>(1) // boolean
const r2 = f(1) // boolean
好的,所以我们知道这是不可能的。现在的解决方法是,为了让它在不失去与原始声明的联系的情况下工作,我提出了额外的泛型类型FType
。考虑:
type FType<T> = (t: T) => T extends number ? boolean : object;
// join function declaration with FType:
declare function f<T>(...t: Parameters<FType<T>>): ReturnType<FType<T>>
type ResForNumArg = ReturnType<FType<number>>; // bool
type ResForStringArg = ReturnType<FType<object>>; // object
通过使用实用程序类型Parameters
,ReturnType
我连接FType
了函数f
声明。它很冗长,但我们最终得到了我们想要的,并且FType
可以以标准方式应用。
推荐阅读
- matlab - 如何在Matlab中将前6行和所有列设置为0
- r - 带弹性表和官员的行高
- google-chrome - 如何在 chrome 启动时在后台完全加载固定的 youtube 选项卡?
- android - 如何在一个通知通道上为 Android 前台服务使用不同的声音
- excel - 类型:不匹配 VBA 错误 - 代码不起作用
- javascript - 使用 Django if 语句在网页上运行 JavaScript
- php - 为什么 wp_list_categories() 会自动插入到页面顶部?
- pandas - 为 LDA 主题模型寻找前 3 个主要主题
- r - R:geom_smooth + geom_hline 使内存使用量爆炸式增长
- java - Android:切断约束布局