Как стать автором
Обновить

Комментарии 7

Я купил! Спасибо! Классная книжка

А на английском этой же книги нет?

Книжка супер, перевод хороший 👍

Человек переписал функцию с JavaScript на TypeScript

А если убрать дженерик-аргументы из 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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий