Рассмотрим следующий код: fiddle
type FilterByPropType<Base, PropType> = { [Key in keyof Base]: Base[Key] extends PropType ? Key : never };
type PropsWithType<Base, PropType> = FilterByPropType<Base, PropType>[keyof Base];
function Decorator<C, K extends PropsWithType<C, (...args: any) => any>>(doSmth: (...pms: Parameters<C[K]>) => ReturnType<C[K]>) {
return function (target: C, key: K, descriptor: TypedPropertyDescriptor<C[K] & Function>) {
const originFunc = descriptor.value!;
descriptor.value = function (this: C, ...args: Parameters<C[K]>) {
return Math.random() > .5
? doSmth.apply(this, args)
: originFunc.apply(this, args)
} as C[K];
};
}
class A {
@Decorator<A, "method">((x, y) => y.repeat(x)) // Want to infer generic types
method(x: number, y: string) {
return x + y
}
}
Когда я вызываю декоратор, я должен указать класс, внутри которого он применяется, и имя метода, к которому он применяется напрямую как общие c параметры:
@Decorator<A, "method">((x, y) => y.repeat(x)) // Want to infer generic types
Если я не укажу их, машинопись выведет <unknown, never>
вместо <A, "method">
.
Как я могу сделать это для вывода типов автоматически