Я использую Express и пытаюсь явно определить res.locals. В пакете @types/express Express.Response.locals — это any, поэтому я не могу его перезаписать:
типы/экспресс/index.d.ts:
declare namespace Express {
interface Response {
locals: {
myVar: number
}
}
}
Мое промежуточное ПО:
import * as express from 'express'
function middleware(
req: express.Request,
res: express.Response,
next: express.nextFunction
) {
res.locals.myVar = '10' // I want this to throw a compiler error
next()
}
Я хочу, чтобы мое неправильное назначение res.locals.myVar было ошибкой, но res.locals все еще any в соответствии с моим автозаполнением.
Как я могу удалить any и полностью заменить его?





К сожалению, нет способа переопределить использование слияния интерфейсов. Вы можете немного поработать над типом и заменить тип, используя сопоставленные и условные типы:
import * as express from 'express'
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
type MyResponse = Omit<express.Response, "locals"> & {
locals: {
myVar: number
}
}
function middleware(
req: express.Request,
res: MyResponse,
next: express.NextFunction
) {
res.locals.myVar = '10' // error now
next()
}
Недавно я столкнулся с этой проблемой, и мне удалось решить ее, создав index.d.ts в моей папке src, чтобы перезаписать res.locals, моя реализация выглядела так:
// src/index.d.ts
import 'express';
interface Locals {
message?: string;
}
declare module 'express' {
export interface Response {
locals: Locals;
}
}
Убедитесь, что он также включен в ваш tsconfig.json, например
// somewhere in your tsconfig.json
"include": [
"src/**/*.ts"
]
Вы будете использовать интерфейс так же, как обычно
import { Request, Response, NextFunction } from 'express';
export const handler = (req: Request, res: Response, next: NextFunction) => {
// should be typed
res.locals.message = 'hello'
}
Надеюсь это поможет!
Привет Фарис, спасибо за ответ. Я попробовал это, но с предоставленными решениями все другие типы «экспресс» исчезли. Как вы решили это?
Привет @natterstefan, убедитесь, что вы импортируете экспресс в верхней части index.d.ts
Привет, @Faris, спасибо за быстрый ответ. Не могли бы вы обновить и дополнить приведенный выше пример, пожалуйста? Даже импорт express не решает эту проблему. Возможно, вы также можете добавить пример использования, например. const handler: Express.Handler = (req, res, next) => { ... }. res должен иметь правильный набор текста, верно? Спасибо!
Привет, @natterstefan, я добавил кое-что еще, что может помочь.
Спасибо @Faris, теперь у меня работает. Вы также знаете, как расширить Express.Handler , чтобы мне не нужно было добавлять res: Response, но при этом можно было использовать настраиваемый интерфейс Response?. Обновлено: возможно, вы также можете дать ссылку на этот ресурс в своем ответе -> github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/…
Я думаю, что этот ответ устарел. Вот что у меня сработало (экспресс 4.16.1): stackoverflow.com/a/55718334/3670829
У меня тоже не работал экспресс 4.17
Это бросает
Type '(request: Request<ParamsDictionary, any, any, ParsedQs>, response: MyResponse) => Promise<Response<any> | undefined>' is missing the following properties from type 'Application': init, defaultConfiguration, engine, set, and 61 more.для меня. Я использую экспресс4.17.