我正在尝试构建一个可以接受简化的函数数组的函数。它做很多其他事情,但从本质上讲,它是一个管道。我想使用泛型来推断函数的输出。出于某种原因,除非我将数组作为rest参数,否则它将无法正常工作。
极端简化的示例:
const pipe = <A, B, C, D>(items: [
(a: A) => B,
(b: B) => C,
(c: C) => D
]): D => {
return items.reduce((acc, fn) => fn(acc), {} as A & B & C) as D;
};
如果我这样称呼:
const result = pipe([
(a: {}) => ({
...a,
age: 4,
}),
(b) => ({
...b,
color: 'blue',
}),
(c) => ({
...c,
height: 100,
}),
]);
我得到的类型为{ height: number }
。
似乎只是失去了思路。尽管参数b
的类型为{ age: number }
,但是参数c
的类型为{}
。
如果我做完全相同的事情,但带有rest参数:
const pipe = <A, B, C, D>(...items: [
(a: A) => B,
(b: B) => C,
(c: C) => D
]): D => {
return items.reduce((acc, fn) => fn(acc), {} as A & B & C) as D;
};
我得到的类型为{ age: number, color: string, height: number }
。
有人能对此有所启发吗?