Комментарии 7
Я купил! Спасибо! Классная книжка
А на английском этой же книги нет?
Книжка супер, перевод хороший 👍
Подскажите, есть ли удобная читалка, которая сможет подсвечивать синтаксис?
А если убрать дженерик-аргументы из PipeArgs, которые не выглядят там нужными, то раза в 2 сократится код. Уверен что можно ещё. Но так да - при большом желании что угодно можно переписать в х10 строк.
Ужасно. Оно ещё и мышей не ловит.
Я бы так сделал:
type Rest<T> = ReadonlyArray<(x: T) => T>;
function pipe<V>(x: V, ...fns: Rest<V>): V;
function pipe<V, R0>(x: V, f0: (x: V) => R0, ...fns: Rest<R0>): R0;
function pipe<V, R0, R1>(x: V, f0: (x: V) => R0, f1: (x: R0) => R1, ...fns: Rest<R1>): R1;
function pipe<V, R0, R1, R2>(x: V, f0: (x: V) => R0, f1: (x: R0) => R1, f2: (x: R1) => R2, ...fns: Rest<R2>): R2;
function pipe(x: unknown, ...fns: Array<(a: unknown) => unknown>) {
return fns.reduce((acc, fn) => fn(acc), x);
}
Вариант не без минусов, но относительно лаконичный и простой. При необходимости докидываются перегрузки с R3, R4 и т.д. Нормальный тайпчек и автокомплит.
Примерно в таком ключе и типизируются подобные функции с рестами произвольных типов, например Object.assign
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Основы TypeScript