Я пытаюсь добавить свойство для выражения объекта запроса из промежуточного программного обеспечения с использованием машинописного текста. Однако я не могу понять, как добавить к объекту дополнительные свойства. Я бы предпочел не использовать скобки, если это возможно.
Я ищу решение, которое позволило бы мне написать что-то подобное (если возможно):
app.use((req, res, next) => {
req.property = setProperty();
next();
});
node.js
express
typescript
Исак Агрен
источник
источник
Ответы:
Вы хотите создать собственное определение и использовать в Typescript функцию слияния деклараций . Это обычно используется, например, в
method-override
.Создайте файл
custom.d.ts
и убедитесь , чтобы включить его вtsconfig.json
«sfiles
-сече- , если таковые имеются. Содержимое может выглядеть следующим образом:Это позволит вам в любой момент кода использовать что-то вроде этого:
источник
files
Секция ограничивает набор файлов , включенных машинопись. Если вы не укажетеfiles
илиinclude
, то все*.d.ts
будут включены по умолчанию, поэтому нет необходимости добавлять туда свои собственные типы ввода.Property 'tenant
что не существует по типу «Запрос». Не имеет значения, включаю я его явноtsconfig.json
или нет. ОБНОВЛЕНИЕ Сdeclare global
as @basarat pointet в его ответах работает, но я должен был сделатьimport {Request} from 'express'
сначала.Request
объект в expressjs (по крайней мере, 4.x)Как указано в комментариях в
index.d.ts
, вы просто объявляете в глобальномExpress
пространстве имен любые новые члены. Пример:Полный пример:
Более подробно о расширении глобальных пространств имен можно прочитать в моем GitBook .
источник
Для более новых версий Express вам необходимо расширить
express-serve-static-core
модуль.Это необходимо, потому что теперь объект Express исходит оттуда: https://github.com/DefinitiTyped/DefinitiTyped/blob/8fb0e959c2c7529b5fa4793a44b41b797ae671b9/types/express/index.d.ts#L19
В основном используйте следующее:
источник
'express'
модуля - нет. Спасибо!import {Express} from "express-serve-static-core";
export {}
которое тоже работает.express.d.ts
, в противном случае компилятор будет пытаться объединить это к экспресс типизации, что приводит к ошибкам.Принятый ответ (как и другие) не работает для меня, но
сделал. Надеюсь, это кому-то поможет.
источник
*.d.ts
файлы и просто храните свои типы в обычных*.ts
файлах.custom-declarations.d.ts
файл в корень проекта TypeScript.import { Request as IRequest } from 'express/index';
иinterface Request extends IRequest
. Также пришлось добавить typeRootПосле того, как попробовали 8 или около того ответов, но безуспешно. Я , наконец , удалось получить его работу с jd291 комментарием указывающей «ы к 3mards репо .
Создайте в базе файл под названием
types/express/index.d.ts
. И в нем напишите:и включить его в
tsconfig.json
:Затем
yourProperty
должны быть доступны по каждому запросу:источник
Ни одно из предложенных решений у меня не помогло. В итоге я просто расширил интерфейс запроса:
Затем использовать:
Изменить : последние версии TypeScript жалуются на это. Вместо этого мне пришлось сделать:
источник
В TypeScript интерфейсы открыты. Это означает, что вы можете добавлять к ним свойства из любого места, просто переопределяя их.
Учитывая, что вы используете этот файл express.d.ts , у вас должна быть возможность переопределить интерфейс запроса, чтобы добавить дополнительное поле.
Затем в вашей функции промежуточного программного обеспечения параметр req также должен иметь это свойство. Вы сможете использовать его без каких-либо изменений в вашем коде.
источник
Request.user = {};
вapp.ts
том жеuserController.ts
знает об этом?express.Handler
(вместо того, чтобы указывать вручную(req: express.Request, res: express.Response, next: express.NextFunction) => any)
), он, похоже, не относится к тому же,Request
поскольку жалуется, что моего свойства не существует.declare module "express"
но не если используюdeclare namespace Express
. Я бы предпочел использовать синтаксис пространства имен, но у меня он просто не работает.Хотя это очень старый вопрос, я недавно наткнулся на эту проблему. Принятый ответ работает нормально, но мне нужно было добавить настраиваемый интерфейс
Request
- интерфейс, который я использовал в своем коде, и который не работал так хорошо с принятым ответ. По логике, я попробовал это:Но это не сработало, потому что Typescript обрабатывает
.d.ts
файлы как глобальный импорт, и когда в них есть импорт, они рассматриваются как обычные модули. Вот почему приведенный выше код не работает со стандартной настройкой машинописного текста.Вот что я в итоге сделал
источник
.d.ts
,tsconfig.json
и экземпляр использования? Кроме того, какую версию машинописного текста вы используете, поскольку этот импорт в глобальные модули поддерживается только начиная с TS 2.9? Это могло бы помочь лучше.... "include": [ "src/**/*" ] ...
но у меня работает, но"include": ["./src/", "./src/Types/*.d.ts"],
не работает. Я еще не углубился в попытки понять этоВозможно, на этот вопрос был дан ответ, но я хочу немного поделиться, теперь иногда интерфейс, такой как другие ответы, может быть слишком ограничительным, но мы действительно можем поддерживать необходимые свойства, а затем добавлять любые дополнительные свойства, создавая ключ с типом
string
с типом значенияany
Итак, теперь мы также можем добавить к этому объекту любое дополнительное свойство, которое захотим.
источник
Все эти ответы кажутся ошибочными или устаревшими в той или иной степени.
Это сработало для меня в мае 2020 года:
в
${PROJECT_ROOT}/@types/express/index.d.ts
:in
tsconfig.json
добавьте / объедините свойство таким образом, чтобы:Приветствия.
источник
Если вы ищете решение, которое работает с express4, вот оно:
@ types / express / index.d.ts: -------- должно быть /index.d.ts
tsconfig.json:
Ссылка с https://github.com/TypeStrong/ts-node/issues/715#issuecomment-526757308
источник
Одно из возможных решений - использовать «двойное приведение к любому».
1- определить интерфейс с вашей собственностью
2- двойной заброс
Преимущества двойного литья:
-noImplicitany
флагомВ качестве альтернативы есть быстрый (нетипизированный) маршрут:
(не редактируйте существующие файлы определений своими собственными свойствами - это невозможно поддерживать. Если определения неверны, откройте запрос на перенос)
РЕДАКТИРОВАТЬ
См. Комментарий ниже, в этом случае работает простой кастинг
req as MyRequest
источник
MyRequest
расширяетhttp.IncomingMessage
. Если бы это было не так,any
то единственной альтернативой была бы двойнаяЭтот ответ будет полезен тем, кто полагается на пакет npm
ts-node
.Я также боролся с той же проблемой расширения запроса объекта , я следил за множеством ответов в переполнении стека и закончил, следуя указанной ниже стратегии.
Я объявил расширенную типизацию для экспресс в следующем каталоге.
${PROJECT_ROOT}/api/@types/express/index.d.ts
затем обновите мой
tsconfig.json
до чего-то вроде этого.даже после выполнения описанных выше шагов визуальная студия перестала жаловаться, но, к сожалению,
ts-node
компилятор все еще бросал.По-видимому,
ts-node
не удалось найти определения расширенного типа для запроса объекта .В конце концов, потратив часы, я знал, что VS Code не жаловался и смог найти определения ввода, подразумевая, что что-то не так с
ts-node
complier.Обновление начало
script
вpackage.json
фиксированной для меня.что
--files
аргументы играют ключевую роль здесь найти определение пользовательских определений типа.Для получения дополнительной информации посетите: https://github.com/TypeStrong/ts-node#help-my-types-are-missing
источник
Чтобы помочь всем, кто просто ищет что-то еще, чтобы попробовать, вот что у меня сработало в конце мая 2020 года, когда я пытался расширить запрос ExpressJS. Мне пришлось перепробовать более дюжины вещей, прежде чем это заработало:
источник
Может быть, уже довольно поздно для этого ответа, но в любом случае вот как я решил:
tsconfig
файл включен источник ваших типов (это может быть совершенно новый поток)express
express
каталога создайте файл и назовите егоindex.d.ts
(ДОЛЖЕН БЫТЬ ТОЧНО ТАК)источник
зачем нам столько хлопот, как в принятых выше ответах, когда мы можем уйти от этого
вместо того, чтобы прикреплять наше свойство к запросу , мы можем прикрепить его к заголовкам запроса
источник