TypeScript中能否通过类的实例获取该类静态方法的类型?
问题解答
这个需求可以实现,你写的代码不生效是 TypeScript 的默认类型推导规则导致的。
问题原因
TypeScript 对所有类实例的 constructor 属性默认推导的类型是通用的 Function 类型,不会自动关联到该实例对应的类的静态类型,所以直接通过 foo['constructor']['bar'] 索引无法拿到静态方法的类型。
解决方法
方法1:在原类中显式声明 constructor 类型
直接给类的实例侧添加 constructor 类型声明,指向类本身的静态类型即可:
class Foo { static bar (v: boolean) { return v } // 新增这一行,显式指定实例constructor的类型 declare ['constructor']: typeof Foo } const foo = new Foo() type v = typeof foo['constructor']['bar'] // v的类型推导结果为:(v: boolean) => boolean
方法2:通过工具类型反向提取(无需修改原类)
如果你不能修改原类的定义,可以写一个条件工具类型,从实例类型反向推导对应的类的静态类型:
class Foo { static bar (v: boolean) { return v } } const foo = new Foo() // 工具类型:从实例类型获取对应类的静态类型 type GetClassStaticType<T> = T extends InstanceType<infer C> ? C : never type v = GetClassStaticType<typeof foo>['bar'] // 推导结果同样为:(v: boolean) => boolean
内容的提问来源于stack exchange,提问作者ThomasReggi
相关产品推荐
相关产品推荐

