打字稿反转参数顺序

时间:2019-06-20 09:31:46

标签: javascript typescript

颠倒函数的参数顺序很简单,但是为颠倒的函数推断类型似乎很困难(或者因此不可能)。

给出此(非TS)代码

const flip = (fn) => function() {
  return fn(...Array.from(arguments).reverse());
};

我试图找到一种方法来键入返回的包装函数,以使fn的参数反向。我似乎找不到解决方法,也找不到任何文档。

示例:

export const flip = <T extends (...args: any[]) => any>(fn: T) =>
    (...args: any[]) => fn(...Array.from(args).reverse());

正确,返回的类型为(...args: any[]) => T

有没有一种方法可以删除(...args:any[]) => fn(...);,使TS能够理解包装函数的参数顺序只是内部函数参数的反向数组?

1 个答案:

答案 0 :(得分:0)

函数参数列表是Tuple,因此您需要在对其调用Tuple之后将其强制转换回正确的Array.reverse类型。

const reverse = <A extends Array<any>>(a: A): Reverse<A> =>
  (a.reverse() as unknown) as Reverse<A>;

type Flip = <A extends Array<any>, R>(f: (...a: A) => R) => (...a: Reverse<A>) => R;
const flip: Flip = (fn) => (...args) => fn(...(reverse(args) as any));

const getArgs = <A extends Array<any>>(...args: A): A => args;
const reversed: [string, string, null, number] = flip(getArgs)(1, null, 'bar', 'foo');

根据打字稿元组开发人员的反馈更新了答案。有关完整讨论,请参见https://github.com/ksxnodemodules/typescript-tuple/issues/12