TypeScript传入类到函数无法推断类成员key的问题
问题原因及解决方法
问题根源
核心问题是类型推断的对象不一致:
- 把
Foo作为参数传入foo函数时,泛型C被推断为构造函数的类型(也就是typeof Foo,对应类本身这个对象的类型),此时keyof C取到的是构造函数自身的属性(比如prototype、name、length这些原型链相关的key),而非实例的成员。 - 直接写
type Keys = keyof Foo时,TypeScript会自动把Foo解析为类的实例类型,所以能正确拿到实例的bar属性。
解决方法
修改函数的泛型约束,让它接收构造函数类型,再通过InstanceType<C>获取实例类型,进而限制key为实例的成员:
class Foo { bar: string; } // 泛型C约束为任意构造函数类型 function foo<C extends new (...args: any[]) => any>(comp: C, key: keyof InstanceType<C>) { } foo(Foo, 'bar') // 现在能正确提示bar,传入无效key会报错
这样修改后,函数会基于构造函数推断出实例的类型,从而正确约束key参数为实例的成员属性。
内容的提问来源于stack exchange,提问作者undefined
相关产品推荐
相关产品推荐

