JS Currying 一个静态函数

JS Currying a static function

我有一段代码如下。

// controller.js
class Controller {
    static easyPost = _post(EasyAuth, EasyValidate, EasyHandle);

    static hardPost = _post(HardAuth, HardValidate, HardHandle);

    static _post(auth, validate, handle) {
        return (req) => {
            if (auth(req) && validate(req))
                handle(req);
        }
    }
}

module.exports = Controller;

//controllermapper.js
const Controller = require("./controller");

class ControllerMapper {
    static map(req) {
        switch (req.path) {
            case "/easyPost":
                Controller.easyPost(req);
                break;
            case "/hardPost":
                Controller.hardPost(req);
                break;
        }
    }
}

背后的想法是我可以通过currying创建easyPosthardPost。因为他们的总体流程非常相似。

但是,当我尝试将代码推送到 Google 云函数时。它会抛出类似

的错误
> Detailed stack trace: /user_code/controller.js:6
>     static easyPost = _post(EasyAuth, EasyValidate, EasyHandle);
>                     ^
> 
> SyntaxError: Unexpected token =

我应该怎么做才能解决这个问题?


编辑

我把代码改成了

// controller.js
class Controller {
    static easyPost(req) {
        Controller._post(EasyAuth, EasyValidate, EasyHandle)(req);
    }

    static hardPost(req) {
        Controller._post(HardAuth, HardValidate, HardHandle)(req);
    }

    static _post(auth, validate, handle) {
        return (req) => {
            if (auth(req) && validate(req))
                handle(req);
        }
    }
}

如果这是一个好的做法,可以对此发表评论吗?

目前可以使用

class Controller {
    static _post(auth, validate, handle) {
        return req => {
            if (auth(req) && validate(req)) handle(req);
        };
    }
}
Controller.easyPost = _post(EasyAuth, EasyValidate, EasyHandle);
Controller.hardPost = _post(HardAuth, HardValidate, HardHandle);

有一个第 3 阶段提案,您编写的代码可以正常工作 - https://github.com/tc39/proposal-static-class-features/

好吧,不完全是写的 - 你需要指定 Controller._post 如下

class Controller {
    static _post(auth, validate, handle) {
        return (req) => {
            if (auth(req) && validate(req))
                handle(req);
        }
    }
    static easyPost = Controller._post(EasyAuth, EasyValidate, EasyHandle);
    static hardPost = Controller._post(HardAuth, HardValidate, HardHandle);
}

注意:您可以在 babeljs 中启用它,但它在 babel 中处于第 2 阶段

关于您更新的代码 - 您仍然需要调用 Controller._post 而不仅仅是 _post

class Controller {
    static easyPost(req) {
        return Controller._post(EasyAuth, EasyValidate, EasyHandle)(req);
    }

    static hardPost(req) {
        return Controller._post(HardAuth, HardValidate, HardHandle)(req);
    }

    static _post(auth, validate, handle) {
        return (req) => {
            if (auth(req) && validate(req))
                handle(req);
        }
    }
}

为了证明您必须使用 Controller._post,这里是您的代码的精简版本

class Controller {
    static succeeds(req) {
        return Controller._post()(req);
    }

    static fails(req) {
        return _post()(req);
    }

    static _post() {
        return (req) => {
           return `got ${req}`;
        }
    }
}
console.log(Controller.succeeds('ok'))
console.log(Controller.fails('ok'))


最后,您不必使用 Controller._post

的代码版本
const post = (auth, validate, handle) => (req) => {
    if (auth(req) && validate(req)) {
        handle(req);
    }
};
class Controller {
    static easyPost(req) {
        return post(EasyAuth, EasyValidate, EasyHandle)(req);
    }

    static hardPost(req) {
        return post(HardAuth, HardValidate, HardHandle)(req);
    }

}
module.exports = Controller;

现在 post 也是私有的

虽然,如果我写这个,我会简单地做

const post = (auth, validate, handle) => (req) => {
    if (auth(req) && validate(req)) {
        handle(req);
    }
};
class Controller {
}
Controller.easyPost = post(EasyAuth, EasyValidate, EasyHandle);
Controller.hardPost = post(HardAuth, HardValidate, HardHandle);
module.exports = Controller;

或者,如果这就是 Controller 的全部内容

const post = (auth, validate, handle) => (req) => {
    if (auth(req) && validate(req)) {
        handle(req);
    }
};
module.exports = {
    easyPost: post(EasyAuth, EasyValidate, EasyHandle),
    hardPost: post(HardAuth, HardValidate, HardHandle)
};