我想创建一个函数,它接受一个函数数组,数组中的每一项都按顺序执行,结果与其他一些数据沿着传递给下一项。下面是一个我想做的事情的例子:
callExample([
(stuff) => 123,
(stuff, previousResult) => previousResult ** 2,
(stuff, previousResult) => String(previousResult)
])
我希望能够输入这个,这样我就知道previousResult
的类型是什么,并将callExample
的返回类型输入为数组中最后一个函数的返回类型。
我意识到
type Example<A, B, C> = ([
(stuff: unknown) => A,
(stuff: unknown, previous: A) => B,
(stuff: unknown, previous: B) => C,
]) => C
适用于已知数量的元素,但是否有一种方法来键入关系本身并支持动态数量的项目?
2条答案
按热度按时间olmpazwi1#
可以使用元组类型沿着rest运算符
...
那么
MyArguments
将是可变长度元组类型,其中第一个元素类型是(stuff: unknown) => A
,其余元素的类型是(stuff: unknown, previous: A) => B)
那么你的
Example
类型将是:TypeScript手册中的更多信息
3okqufwl2#
算法:
T
是函数数组T
的第一个元素,检索stuff
的类型,并返回第一个函数的类型T
的其余部分的递归类型Func
是T
其余部分中的第一个元素Result
数组添加一个函数,该函数接受具有定义类型和前一个值的stuff
,前一个值是前一个函数的返回类型Func
的类型T
为空,则返回Result
实施:
我们正在使用inject关键字检索函数数组的元素。
要获得
stuff
的类型,我们使用内置的参数实用程序类型用途:
我们需要使用constAssert来防止编译器扩大输入数组的类型。ConstAssert将把数组转换为
readonly
,这就是为什么我们到处都有readonly
的原因:链接到Playground