Estou tentando adicionar uma propriedade para expressar o objeto de solicitação de um middleware usando o typescript. No entanto, não consigo descobrir como adicionar propriedades extras ao objeto. Eu prefiro não usar a notação de colchetes, se possível.
Estou procurando uma solução que me permita escrever algo semelhante a isto (se possível):
app.use((req, res, next) => {
req.property = setProperty();
next();
});
node.js
express
typescript
Isak Ågren
fonte
fonte
Respostas:
Você deseja criar uma definição personalizada e usar um recurso do texto digitalizado chamado Mesclagem de declarações . Isso é comumente usado, por exemplo, em
method-override
.Criar um arquivo
custom.d.ts
e certifique-se de incluí-lo em suatsconfig.json
'sfiles
-section se houver. O conteúdo pode ser o seguinte:Isso permitirá que você, em qualquer ponto de seu código, use algo assim:
fonte
files
seção restringe o conjunto de arquivos incluídos pelo TypeScript. Se você não especificarfiles
ouinclude
, todos*.d.ts
serão incluídos por padrão, portanto, não há necessidade de adicionar suas tipificações personalizadas lá.Property 'tenant
não existe no tipo 'Solicitação' `Não faz diferença se eu incluí explicitamentetsconfig.json
ou não. ATUALIZAR Comdeclare global
como @basarat pointet fora em sua resposta funciona, mas eu tive que fazerimport {Request} from 'express'
primeiro.Request
objeto em expresso (4.x pelo menos)Conforme sugerido pelos comentários no
index.d.ts
, você simplesmente declara aoExpress
namespace global quaisquer novos membros. Exemplo:Exemplo completo:
A extensão de namespaces globais é mais abordada em meu GitBook .
fonte
Para versões mais recentes do express, você precisa aumentar o
express-serve-static-core
módulo.Isso é necessário porque agora o objeto Express vem de lá: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/8fb0e959c2c7529b5fa4793a44b41b797ae671b9/types/express/index.d.ts#L19
Basicamente, use o seguinte:
fonte
'express'
módulo antigo não funcionou. Obrigado!import {Express} from "express-serve-static-core";
export {}
que também funciona.express.d.ts
, caso contrário, o compilador tentará mesclá-lo com as digitações expressas, resultando em erros.A resposta aceita (como as outras) não funciona para mim, mas
fez. Espero que ajude alguém.
fonte
*.d.ts
arquivos e apenas armazenar seus tipos em*.ts
arquivos regulares .custom-declarations.d.ts
arquivo na raiz do projeto do TypeScript.import { Request as IRequest } from 'express/index';
einterface Request extends IRequest
. Também foi necessário adicionar o typeRootDepois de tentar 8 ou mais respostas e não ter sucesso. Eu finalmente consegui fazê-lo funcionar com jd291 comentário de apontamento para 3mards repo .
Crie um arquivo na base chamada
types/express/index.d.ts
. E nele escreva:e incluí-lo em
tsconfig.json
:Em seguida,
yourProperty
deve estar acessível em todas as solicitações:fonte
Nenhuma das soluções oferecidas funcionou para mim. Acabei simplesmente estendendo a interface do Request:
Então, para usá-lo:
Edit : Versões recentes do TypeScript reclamam disso. Em vez disso, tive que fazer:
fonte
No TypeScript, as interfaces são abertas. Isso significa que você pode adicionar propriedades a eles de qualquer lugar apenas redefinindo-os.
Considerando que você está usando este arquivo express.d.ts , você deve ser capaz de redefinir a interface de solicitação para adicionar o campo extra.
Então, em sua função de middleware, o parâmetro req também deve ter essa propriedade. Você deve ser capaz de usá-lo sem nenhuma alteração em seu código.
fonte
Request.user = {};
emapp.ts
como é queuserController.ts
sabe sobre isso?express.Handler
(em vez de especificar manualmente(req: express.Request, res: express.Response, next: express.NextFunction) => any)
), ele não parece se referir ao mesmoRequest
, pois reclama que minha propriedade não existe.declare module "express"
mas não se usardeclare namespace Express
. Eu prefiro usar a sintaxe de namespace, mas ela simplesmente não funciona para mim.Embora esta seja uma pergunta muito antiga, eu tropecei neste problema recentemente. A resposta aceita funciona bem, mas eu precisava adicionar uma interface personalizada
Request
- uma interface que eu estava usando em meu código e que não funcionava tão bem com o aceito responda. Logicamente, tentei isso:Mas isso não funcionou porque o Typescript trata os
.d.ts
arquivos como importações globais e quando eles têm importações são tratados como módulos normais. É por isso que o código acima não funciona em uma configuração de texto digitado padrão.Aqui está o que acabei fazendo
fonte
.d.ts
,tsconfig.json
ea instância uso? Além disso, qual versão do typescript você está usando, já que a importação em módulos globais só é compatível a partir do TS 2.9? Isso poderia ajudar melhor.... "include": [ "src/**/*" ] ...
funciona para mim, mas"include": ["./src/", "./src/Types/*.d.ts"],
não funciona. Eu não tentei entender isso aindaTalvez este problema tenha sido respondido, mas eu quero compartilhar um pouco, agora às vezes uma interface como outras respostas pode ser um pouco restritiva, mas podemos realmente manter as propriedades necessárias e, em seguida, adicionar quaisquer propriedades adicionais a serem adicionadas, criando um chave com um tipo de
string
com tipo de valor deany
Portanto, agora também podemos adicionar qualquer propriedade adicional que quisermos a este objeto.
fonte
Se você está procurando uma solução que funcione com o express4, aqui está:
@ types / express / index.d.ts: -------- deve ser /index.d.ts
tsconfig.json:
Ref de https://github.com/TypeStrong/ts-node/issues/715#issuecomment-526757308
fonte
Todas essas respostas parecem estar erradas ou desatualizadas de uma forma ou de outra.
Isso funcionou para mim em maio de 2020:
em
${PROJECT_ROOT}/@types/express/index.d.ts
:em
tsconfig.json
, adicione / mescle a propriedade de modo que:Felicidades.
fonte
Uma solução possível é usar "dupla fundição para qualquer"
1- definir uma interface com sua propriedade
2- elenco duplo
As vantagens da dupla fundição são:
-noImplicitany
bandeiraComo alternativa, existe a rota rápida (não digitada):
(não edite os arquivos de definição existentes com suas próprias propriedades - isso não pode ser mantido. Se as definições estiverem erradas, abra uma solicitação de pull)
EDITAR
Veja o comentário abaixo, fundição simples funciona neste caso
req as MyRequest
fonte
MyRequest
estende ohttp.IncomingMessage
. Se não fosse o caso, a via duplaany
seria a única alternativaEsta resposta será benéfica para aqueles que confiam no pacote npm
ts-node
.Eu também estava lutando com a mesma preocupação de estender o objeto de solicitação , segui muitas respostas no estouro de pilha e terminei seguindo a estratégia mencionada abaixo.
Declarei digitação estendida para expresso no seguinte diretório.
${PROJECT_ROOT}/api/@types/express/index.d.ts
em seguida, atualizando meu
tsconfig.json
para algo assim.mesmo depois de fazer as etapas acima, o estúdio visual parou de reclamar, mas infelizmente, o
ts-node
compilador ainda costumava jogar.Aparentemente, o
ts-node
não foi capaz de localizar as definições de tipo estendido para o objeto de solicitação .Eventualmente, depois de passar horas, como eu sabia que o Código VS não estava reclamando e fui capaz de localizar as definições de digitação, sugerindo que algo está errado com o
ts-node
complier.Atualizar iniciar
script
empackage.json
consertou para mim.os
--files
argumentos desempenham um papel fundamental aqui, determinando as definições de tipo personalizado.Para obter mais informações, visite: https://github.com/TypeStrong/ts-node#help-my-types-are-missing
fonte
Ajudar qualquer pessoa que esteja apenas procurando outra coisa para tentar aqui é o que funcionou para mim no final de maio de 2020, ao tentar estender a solicitação do ExpressJS. Tive que ter tentado mais de uma dúzia de coisas antes de fazer isso funcionar:
fonte
Pode ser que já seja tarde para essa resposta, mas de qualquer forma, aqui está como eu resolvi:
tsconfig
arquivo (pode ser um novo tópico)express
express
diretório, crie um arquivo e nomeie-oindex.d.ts
(DEVE SER EXATAMENTE ASSIM)fonte
Por que precisamos fazer tanto trabalho como nas respostas aceitas acima, quando podemos nos safar fazendo exatamente isso
em vez de anexar nossa propriedade à solicitação , podemos anexá-la aos cabeçalhos da solicitação
fonte