Это известная проблема в TypeScript без очевидного решения (кроме ручного указания параметров универсального типа).
Проблема с реализацией этого, как объяснено в этом комментарии @ DanielRosenwasser , заключается в том, что использование декораторов похоже на вызов функции curry , и тип общего вывода, который вы хотите, был бы быть таким:
declare let f: <T>(callback: (x: T) => void) => (y: T) => void;
f(x => x.a)({ a: 100 }); // error!
// ~ <-- T is inferred as {} or unknown,
, который не работает, потому что TypeScript выводит универсальный тип, когда функция f
вызывается в своем аргументе обратного вызова, и не ожидает, пока возвращенная функция сама не будет вызвана. Таким образом, к тому времени, когда тип T
будет фактически известен как компилятор, будет слишком поздно, и он уже не сможет правильно вывести.
Я не знаю, есть ли у меня какой-либо совет, кроме как продолжать указывать аргументы вручную, и, возможно, перейти к этому вопросу в TypeScript и дать ему ? или описать свой вариант использования, если вы считаете, что он более убедителен, чем другие упоминается. Удачи!