这里的目标是从具有argument combination个函数的2个函数中创建一个函数.它可以很容易地用JavaScript完成,但用TypeScrip就不容易了.

组合两个函数的一种方法是Proxy.示例:

const f1 = (a: number) => {
    return (a + 1) * 2;
} 

const f2 = (b: string, c: string[]) => {
    c.push(b);
    return c;
}

const combiner = (f1: Function, f2: Function) => {
    return new Proxy(f1, {
        apply(target, thisArg, args) {
            const f1_args = args.slice(0, f1.length);
            const f2_args = args.splice(f1.length);
            f1(...f1_args);
            f2(...f2_args);
        }
    });
};

const f = combiner(f1, f2);

f(1, 'foo', ['bar']); // Typehints?

问题是could it be typed with typescript to typehint result of 100 function?

推荐答案

通过使用保存两个函数的参数元组类型的两个泛型类型A1A2,可以很容易地实现组合函数的参数类型化.

const combiner = <
  A1 extends any[], 
  A2 extends any[]
>(f1: (...args: A1) => void, f2: (...args: A2) => void) => {
    return new Proxy(f1, {
        apply(target, thisArg, args) {
            const f1_args = args.slice(0, f1.length);
            const f2_args = args.splice(f1.length);
            f1(...f1_args as A1);
            f2(...f2_args as A2);
        }
    }) as unknown as (...args: [...A1, ...A2]) => void
};

我们只需要断言返回的类型是一个参数类型为A1A2的组合元组的函数.

const f = combiner(f1, f2);
//    ^? const f: (a: number, b: string, c: string[]) => void

f(1, 'foo', ['bar']);

Playground

Javascript相关问答推荐

基于变量切换隐藏文本

Msgraph用户邀请自定义邮箱模板

在react js中使用react—router—dom中的Link组件,分配的右侧不能被 destruct ''

成功完成Reducers后不更新状态

给定一个凸多边形作为一组边,如何根据到最近边的距离填充里面的区域

无法访问Vue 3深度监视器中对象数组的特定对象值'

如何将数组用作复合函数参数?

如何在Angular拖放组件中同步数组?

如何在Bootstrap中减少网格系统中单个div的宽度

传递方法VS泛型对象VS事件特定对象

匹配一个或多个可选重复的特定模式

ngOnChanges仅在第二次调用时才触发

顶点图使用组标签更新列之间的条宽

未找到用于 Select 器的元素:in( puppeteer 师错误)

ComponentWillReceiveProps仍在React 18.2.0中工作

AstroJS混合模式服务器终结点返回404

JS/css:将数字输入的S函数和可调整大小的元素S函数绑定在一起

如何在Java脚本中添加一个可以在另一个面板中垂直调整大小的面板?

我在JS代码中收到超过最大调用堆栈大小的错误,但我找不到原因.有谁能帮我搬一下吗?

App Script如何读取通过云函数传递的表单对象