Проблема с tsconfig в строгом режиме, и тип (...) не может быть назначен типу (...) - PullRequest
0 голосов
/ 26 марта 2019

Я знаю, что есть довольно много вопросов по этому поводу, я прочитал большинство из них (я полагаю), и они помогли мне лучше понять эту ошибку и способы ее решения в большинстве случаев.

Однако я сталкиваюсь с тем, что не могу решить самостоятельно, поэтому извиняюсь, если SO не подходит для этого вопроса (я думаю, что это может быть обманом, так как уже есть вопросы по этому вопросу, но я не нашел ни одного это помогло мне решить этот «частный случай»).

У меня есть следующий фрагмент кода:

import { Request } from 'express'
import multer from 'multer'
import path from 'path'

class ImageMiddleware {

    // ...

    private storage (folder: string): multer.StorageEngine {
        return multer.diskStorage({
            destination: (
                _req: Request,
                _file: Express.Multer.File,
                callback: (error: Error | null, destination: string) => void
            ): void => {
                return callback(null, `./public/img/${folder}`)
            },
            filename: (
                req: Request,
                file: Express.Multer.File,
                callback: (error: Error | null, destination: string) => void): void => {
                callback(
                    null,
                    `${file.fieldname}`
                    + `-`
                    + `${Date.now()}`
                    + `${req.user.id}`
                    + `${path.extname(file.originalname)}`
                )
            },
        })
    }

    // ...
}

export default new ImageMiddleware()

С этим tsconfig.json:

{
    "compilerOptions": {
        "target": "ES6",
        "module": "commonjs",
        "outDir": "./dist/",
        "sourceMap": true,
        "removeComments": true,
        "pretty": true,
        "noUnusedLocals": true,
        "noUnusedParameters": true,
        "alwaysStrict": true,
        "noImplicitThis": true,
        "noImplicitAny": true,
        "allowUnreachableCode": false,
        "esModuleInterop": true,
        "strict": true
    },
    "exclude": ["**/spec/*.spec.ts", "./node_modules"]
}

Но при запуске ./node_modules/typescript/bin/tsc появляется следующая ошибка:

services/middlewares/image/image.middleware.ts:112:13 - error TS2322: Type '(_req: Request, _file: File, callback: (error: Error | null, destination: string) => void) => void' is not assignable to type 'string | ((req: Request, file: File, callback: (error: Error | null, destination: string) => void) => void) | undefined'.
  Type '(_req: Request, _file: File, callback: (error: Error | null, destination: string) => void) => void' is not assignable to type '(req: Request, file: File, callback: (error: Error | null, destination: string) => void) => void'.
    Types of parameters '_req' and 'req' are incompatible.
      Type 'Request' is missing the following properties from type 'Request': get, header, accepts, acceptsCharsets, and 71 more.

112             destination: (
                ~~~~~~~~~~~

  node_modules/@types/multer/index.d.ts:59:9
    59         destination?: string | ((req: Express.Request, file: Express.Multer.File, callback: (error: Error | null, destination: string) => void) => void);
               ~~~~~~~~~~~
    The expected type comes from property 'destination' which is declared here on type 'DiskStorageOptions'

Так что я думаю, что строка ): void => { неправильная, поэтому я много чего пытался отладить, но не нашел ничего успешного.

Выход ./node_modules/typescript/bin/tsc -v равен Version 3.3.4000

Любая помощь будет приветствоваться, пожалуйста, дайте мне знать, если я забыл некоторые важные сведения

1 Ответ

0 голосов
/ 26 марта 2019

Поскольку эта ошибка есть в node_modules, единственная надежда исправить это - запрос на извлечение к хранилищу типизаций.

А пока, чтобы отключить ошибку, включите "skipLibCheck": true в tsconfig.

РЕДАКТИРОВАТЬ: Извините, неправильно прочитал, откуда пришла ошибка.

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

...