尝试创建一个仅接受实例方法 prop 名称的静态方法,不幸的是,我不知道如何在以下情况下实现它。有什么想法吗(请不要在调用签名中使用类型断言)?
type MethodKeys<T extends object> = keyof { [K in keyof T as T[K] extends (...args: any) => any ? K : never]: unknown };
class Model{
static chainMethod<C extends typeof Model, T extends InstanceType<C>, K extends MethodKeys<T>>
(this: C, name: K, method: T[K]) {
}
method(){
}
}
class Party{
static addProps<C extends typeof Model>(model: C){
model.chainMethod('method', function(){ // error
})
}
}
再试一次:
class Model{
static chainMethod<C extends typeof Model, T extends InstanceType<C>, K extends keyof T, F extends T[K] extends (...args: any) => any ? T[K]: never>
(this: C, name: K, method: F) {
}
method(){
}
}
class Party{
static addProps<C extends typeof Model>(model: C){
model.chainMethod('method', function(){
})
}
}
更新
Matt Kantor 已经解决了第二个解决方案,但我仍然更喜欢第一个解决方案,其中自动完成功能仅显示方法名称