尝试创建一个仅接受实例方法 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 已经解决了第二个解决方案,但我仍然更喜欢第一个解决方案,其中自动完成功能仅显示方法名称
我相信这有你想要的行为:
操场
在泛型函数类型中使用尽可能少的类型参数是一个很好的经验法则。我还用交集替换了条件类型(用于检查方法性),因为这样类型检查器更容易推理。
根据您的更新,这是具有不同自动完成行为的另一个版本:
操场