具有返回类型应用于下一个函数的函数数组

时间:2019-01-31 08:12:27

标签: typescript

我正在寻找一种包含函数的唯一类型的数组。

const a = [
  (): { a: string } => ({ a: 'alpha'}),
  ({ a }): { b: string } => ({ b: 'beta' }),
  ({ a, b }): {} => ({}),
]

这些函数具有显式的返回类型,我想要的是一种不必指定输入类型的方法,并且使输入类型具有“链”的方式,以便所有输入类型均为{{1} }中所有先前函数的返回类型。

如果这不可能,至少可以有这样的接口:

Merge

并为采用interface State { a: string, b: string } 的数组创建泛型类型并将其作为部分应用于该数组中每个函数的所有输入和返回类型?

2 个答案:

答案 0 :(得分:0)

您可以根据先前的功能创建一个功能链,其中的一个功能取决于上一个功能,但是您需要一个功能并为要支持的每个数字功能重载:

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

const a =chain( // return types are not necessary.
    () => ({ a: 'alpha'}),
    ({ a })  => ({ b: 'beta' }),
    ({ a, b }) => ({ c: a, z:a }),
)

答案 1 :(得分:0)

不太好,但这提供了一些支持:

type JourneyFn<T> = (s: Partial<T>) => Partial<T> | Promise<Partial<T>>;
type JourneyFns<T> = JourneyFn<T>[]

interface State {
  a: string,
  b: string
}

const a: JourneyFns<State> = [
  () => ({ a: 'alpha'}),
  ({ a }) => ({ b: 'beta' }),
  ({ a, b }): {} => ({}),
]