Декоратор не выводит тип - PullRequest
1 голос
/ 28 апреля 2020

Рассмотрим следующий код: 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">.

Как я могу сделать это для вывода типов автоматически

...