打字稿:映射数组到顺序函数in/output
Typescript: Mapped array to sequential function in/output
在 Typescript 中,有没有一种方法可以用以下方式表达数组 属性?
[
[0]: function(in: A): B;
[1]: function(in: B): C;
[2]: function(in: C): D;
...etc.
]
基本上,一个函数数组,其中下一个函数接受最后一个函数的返回值。我想将它用于 Koa 路由器,其中可以提供一系列中间件。这样,输入可以在一个中间件函数中得到验证,然后在下一个函数中无需转换即可使用。
没办法轻松做到这一点,首先需要一个函数来帮助推理(变量不能声明类型变量)。其次,您需要与要支持的函数数量一样多的重载。
解决方案可能如下所示:
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()
)
在 Typescript 中,有没有一种方法可以用以下方式表达数组 属性?
[
[0]: function(in: A): B;
[1]: function(in: B): C;
[2]: function(in: C): D;
...etc.
]
基本上,一个函数数组,其中下一个函数接受最后一个函数的返回值。我想将它用于 Koa 路由器,其中可以提供一系列中间件。这样,输入可以在一个中间件函数中得到验证,然后在下一个函数中无需转换即可使用。
没办法轻松做到这一点,首先需要一个函数来帮助推理(变量不能声明类型变量)。其次,您需要与要支持的函数数量一样多的重载。
解决方案可能如下所示:
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()
)