Typescript: сопоставленный массив с последовательной функцией в / output - PullRequest
0 голосов
/ 18 января 2019

В Typescript есть ли способ выразить массив следующим свойством?

[
  [0]: function(in: A): B;
  [1]: function(in: B): C;
  [2]: function(in: C): D;
  ...etc.
]

По сути, массив функций, в которых следующая функция принимает возвращенное значение последней. Я хотел бы использовать это для маршрутизатора Koa, где может быть предоставлен массив промежуточного программного обеспечения. Таким образом, входные данные могут быть проверены в одной функции промежуточного программного обеспечения, а затем использованы без приведения в следующей.

1 Ответ

0 голосов
/ 18 января 2019

Нет способа сделать это легко, во-первых, вам нужна функция, которая поможет с выводом (переменные не могут объявлять переменные типа). Во-вторых, вам нужно столько перегрузок, сколько функций вы хотите поддерживать.

Решение может выглядеть примерно так:

function compose<A, R1, R2, R3, R4>(fn1: (a: A) => R1, fn2: (a: R1) => R2, fn3: (a: R2) => R3, fn4: (a: R3) => R4): [typeof fn1, typeof fn2, typeof fn3, typeof fn4]
function compose<A, R1, R2, R3>(fn1: (a: A) => R1, fn2: (a: R1) => R2, fn3: (a: R2) => R3): [typeof fn1, typeof fn2, typeof fn3]
function compose<A, R1, R2>(fn1: (a: A)=> R1, fn2: (a: R1) => R2) : [typeof fn1, typeof fn2]
function compose(...fns: Array<(a: any) => any>) {
    return fns;
}

// fns is  [(a: string) => string, (a: string) => number, (a: number) => string]
let fns = compose(
    (s: string) => s.toUpperCase(),
    s => +s,
    n => n.toExponential()
)
...