TypeScript: методы «аутсорсинга».Чистый путь - PullRequest
0 голосов
/ 22 октября 2018

В настоящее время я работаю над классом, который я использую в качестве промежуточного программного обеспечения в экспрессе.Прежде чем я войду в класс, имейте в виду, что я буду впрыскивать промежуточное ПО позже, сначала создав экземпляр моего класса «Аутентификатор», а затем внедрив его метод с помощью

app.use(authInst.express)

Таким образом, ключевым моментом будетконтекст выполнения (этой) этой функции.Это код, который я получил до сих пор

Альтернатива 1

class Authenticator {
    opts:IAuthOpts ;
    express: RequestHandler| ErrorRequestHandler

    constructor(opts:IAuthOpts){
        this.opts = opts;
        this.express = function(req:Request, res:Response, next:NextFunction){

            if(this.opts.enabled) {
                mainController(req, res, next, this.opts)
            } else {
                next();
            }
        }
    }
}

Это работает.И все же я не хочу писать функцию в конструкторе, так как нахожу ее довольно уродливым кодом.Помещение экспресс-метода непосредственно в класс, как это

Не работает

class Authenticator {
    opts:IAuthOpts;

    constructor(opts:IAuthOpts){
        this.opts = opts;
    }

    express(req, res, next){
        if(this.opts.enabled) {
            mainController(req, res, next, this.opts)
        } else {
            next();
        }    
    }
}

не будет работать, так как контекст выполнения из Express дастмне это как не определено.Так что осталось использовать этот тип альтернативы

Альтернатива 2

class Authenticator {
    opts:IAuthOpts ;
    express: RequestHandler| ErrorRequestHandler

    constructor(opts:IAuthOpts){
        this.opts = opts;
        this.express = _express.bind(this);
    }

    private _express(req, res, next){
        if(this.opts.enabled) {
            mainController(req, res, next, this.opts)
        } else {
            next();
        }    
    }
}

Теперь это тоже работает, и я предпочитаю решение этой проблемынасколько это было бы легко перенести метод на другой файл и сохранить мои файлы маленькими.Недостатком является привязка.Я не большой поклонник связывания, так как хочу, чтобы мои функции возвращали одно и то же значение, если я вызываю их с одинаковыми параметрами, независимо от того, откуда они вызываются, и в этом случае вам всегда нужно привязать класс к нему.

Есть ли лучшее решение для аутсорсинга метода из класса TypeScript, и при этом не нужно вводить контекст выполнения с помощью bind?

1 Ответ

0 голосов
/ 23 октября 2018

Вместо привязки вы можете использовать функцию стрелки:

class Authenticator {
    opts:IAuthOpts ;

    constructor(opts:IAuthOpts){
        this.opts = opts;
    }

    express = (req, res, next) => {
        if(this.opts.enabled) {
            mainController(req, res, next, this.opts)
        } else {
            next();
        }    
    }
}

Если затем вы захотите переместить реализацию в другой файл, вероятно, будет наиболее понятно определить функцию, которая принимает Authenticator как обычный параметр вместе с req, res и next, а затем вызовите эту функцию из функции стрелки:

class Authenticator {
    opts:IAuthOpts ;

    constructor(opts:IAuthOpts){
        this.opts = opts;
    }

    express = (req, res, next) => otherFunction(this, req, res, next);
}

// In other file
function otherFunction(authenticator: Authenticator, req: Request, res: Response, next: NextFunction) { 
    if(authenticator.opts.enabled) {
        mainController(req, res, next, authenticator.opts)
    } else {
        next();
    }    
}

Если это не то, что вы искали,уточните вопрос.

...