Tentando fazer um método estático que aceite apenas nomes de prop de método de instância, infelizmente sem ideias de como fazer isso funcionar com o seguinte caso. Alguma ideia (por favor, sem asserção de tipo na assinatura de chamada)?
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
})
}
}
Outra tentativa:
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(){
})
}
}
ATUALIZAÇÃO
Matt Kantor resolveu a segunda solução, mas eu ainda preferiria a primeira, onde o preenchimento automático mostraria apenas nomes de métodos