颠倒函数的参数顺序很简单,但是为颠倒的函数推断类型似乎很困难(或者因此不可能)。
给出此(非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能够理解包装函数的参数顺序只是内部函数参数的反向数组?
答案 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。