TypeScript, составь против трубы - PullRequest
0 голосов
/ 28 апреля 2020

Мне всегда было трудно реализовать функцию 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.

Есть ли причина для этого?

...