как сделать компилятор TypeScript довольным дисперсией при вызове универсальных обработчиков (например, промежуточного программного обеспечения expressJS) - PullRequest
0 голосов
/ 25 октября 2018

отказ от ответственности: Я все еще немного неясен относительно дисперсии в целом ...

Моя ситуация такова:

// index.ts
import express from 'express';
import {Request, Response} from 'express';
const app = express();
app.use(handler);

interface BetterRequest extends Request {
    foo: string;
}

function handler(req: BetterRequest, res: Response) {
    req.foo = 'bar';
}

// tsconfig.json
{
    "compilerOptions": {
        "target": "es6",
        "module": "commonjs",
        "strict": true,
        "allowSyntheticDefaultImports": true,
        "esModuleInterop": true
    }
}

Ошибка, которую я получаюэто

[ts]
Argument of type '(req: BetterRequest, res: Response) => void' is not assignable to parameter of type 'RequestHandlerParams'.
Type '(req: BetterRequest, res: Response) => void' is not assignable to type 'RequestHandler'.
    Types of parameters 'req' and 'req' are incompatible.
    Type 'Request' is not assignable to type 'BetterRequest'.
        Property 'foo' is missing in type 'Request'.

enter image description here

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

Как правильно написать код, чтобы справиться с этой ситуацией?

- единственный следующий способ?

// index.ts
function handler(req: Request, res: Response) {
    const req2 = req as BetterRequest;
    req2.foo = 'bar';
}

1 Ответ

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

Явное приведение, как вы предложили, вероятно, является лучшим способом, если вы знаете, что собираетесь немедленно установить свойство foo и хотите иметь возможность использовать свойство с этого момента, не проверяя, определено ли оно.Другой подход - объявить свойство foo необязательным;тогда Request может быть неявно преобразовано в BetterRequest (так что ваш обработчик может быть неявно преобразован в обработчик Express), но тип свойства foo будет включать undefined, и вам придется иметь дело счто каждый раз, когда вы используете собственность.

...