如何指定泛型函数的泛型实参以获取对应参数类型?
如何获取泛型静态方法指定泛型实参后的参数类型?
问题场景
现有如下TypeScript代码,希望在指定泛型实参Child的前提下,获取Foo.func方法的第一个参数类型:
class Model{ id = 0; title = 'test'; } class Child extends Model{ child = true; } class Foo { static func<T extends Model>(a: Omit<T, 'id'>): number{ return 0; } } // 目标:获取当T为Child时,func的第一个参数类型 type p = Parameters<typeof Foo['func']>[0] // 当前写法无法指定T为Child
解决方案
你可以直接为泛型函数类型指定具体的泛型实参,再通过Parameters工具类型提取参数类型:
// 写法1:分步定义 type FuncWithChild = typeof Foo['func']<Child>; type p = Parameters<FuncWithChild>[0]; // 类型为 Omit<Child, 'id'>,即 { title: string; child: boolean; } // 写法2:合并为一行 type p = Parameters<typeof Foo['func']<Child>>[0];
原理说明
typeof Foo['func']得到的是未绑定泛型参数的函数类型,此时Parameters提取的是泛型约束对应的参数类型(即Omit<T, 'id'>,其中T是未指定的泛型变量)。通过在函数类型后添加<Child>,我们将泛型参数T绑定为具体的Child类型,此时再用Parameters就能得到该特定场景下的参数类型。
内容的提问来源于stack exchange,提问作者Alexander Nenashev
相关产品推荐
相关产品推荐

