Мне всегда было трудно реализовать функцию compose в TypeScript из-за того, что TS не мог правильно обрабатывать обобщенные функции c, предоставляемые в качестве параметра. Затем я посмотрел выступление TSConf 2019 и Андерс Хейлсберг показал, насколько легко и элегантно можно реализовать функцию compose. И это действительно работает. https://youtu.be/jmPZztKIFf4?t=2688
Первое, что я заметил, это то, что они действительно реализовали стиль конвейера, а не оригинальную композиционную подпись. Разница заключается в порядке переключения функций. Но я хочу использовать оригинальную подпись compose, поэтому я перевернул параметры функции compose (предоставленные Anders Hejlsberg), и она должна была выполнить эту работу.
Так вот, что я получил:
function compose<A extends any[], B, C>(g: (a:B) => C, f: (...args: A)=> B) {
return (...args: A) => g(f(...args));
}
Затем я проверил это, составив 2 id
функции:
function id<A>(a:A): A {
return a;
}
const f = compose(id, id);
Проблема заключается в том, что композиция между 2 id
функциями работает правильно для функции композиции в стиле конвейера, где f
подпись, очевидно, это const f: <A>(a: A) => A
, где для моего стиля сочинения подпись нарушена const f: <A>(a: any) => A
.
Есть ли причина для этого?