Как сопоставить шаблон в `UploadedFile | UploadedFile [] ` - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь реализовать загрузку файла с помощью TypeScript, express -fileupload и body-parser . (Я также успешно установил соответствующие @types).

Я борюсь с преобразованием примера JavaScript в TypeScript, но я думаю, что моя проблема более общая. Я хочу использовать (см. Код) form.mv() и form.name, но компилятор продолжает жаловаться на то, что этих членов не существует. Глядя на тип моей переменной form, это тип объединения UploadedFile | UploadedFile[], поэтому я думаю, что мне нужно переключаться в зависимости от фактического случая типа во время выполнения. Но компилятор не позволяет мне сопоставить с образцом те случаи, которые он фактически вывел (см. Снимок экрана). Как правильно работать с этим типом?

Снимок экрана:

enter image description here

Complete code:

import {Express, Request, Response} from 'express';
import fileUpload = require('express-fileupload');
import bodyParser = require('body-parser');
export class Server {
    private app: Express;
    constructor(app: Express) {
        this.app = app;
        this.app.use(fileUpload({createParentPath: true}));
        this.app.use(bodyParser.json());
        this.app.use(bodyParser.urlencoded({extended: true}));
        this.app.post('/form', (req: Request, res: Response) => {
            try {
                if (!req.files) {
                    res.send({
                        status: false,
                        message: 'No form uploaded'
                    });
                } else {
                    // use the name of the upload field to retrieve the uploaded form
                    let form = req.files.form;
                    // use the mv() method to place the file in the forms directory
                    switch (form) {
                        case fileUpload.UploadedFile: true;
                        case fileUpload.UploadedFile[]: false
                    }
                    form.mv('./forms/' + form.name);
                }
            }
       });
    }
    public start(port: number): void {
        this.app.listen(port, () => console.log(`Server listening on port ${port}!`));
    }
}

1 Ответ

2 голосов
/ 07 августа 2020

вы можете использовать оператор instanceof. он используется для проверки типа объекта во время выполнения.

поэтому ваш код должен выглядеть так

if(form instanceof Array){
// code to be executed for array of files
}else{
// code to be executed for one file object
}

вы можете узнать больше об этом на https://www.geeksforgeeks.org/instanceof-operator-in-javascript/

...