J'ai quelques augmentations de module express. Mon intention est de pouvoir faire :

request.message('Hello').status(400).json({});

Les fonctions status et json font partie de l'objet express Response. Ces fonctions renvoient l'objet Response sur lequel elles ont été appelées pour permettre le chaînage (c'est-à-dire une API fluide).

Je souhaite ajouter ma propre fonction message pour faire à peu près la même chose. Mon augmentation ressemble à ceci:

import { SomeType } from '...';

declare global {
    namespace Express {
        interface Response {
            // This works.  
            getSomeType(): SomeType;

            // This does not.  Typescript thinks the object returned here has ONLY the getSomeType/message functions on it
            message(str: string): Response; 
        }
    }

J'ai essayé des variantes de

message(str: string): Express.Response

Et

message(str: string): Response & Express.Response

Cela n'a fait aucune différence. Comme auparavant : Typescript pense que l'objet renvoyé ici contient SEULEMENT les fonctions getSomeType/message

0
Richard Walton 18 mars 2019 à 22:03

2 réponses

Meilleure réponse

D'accord, j'ai trouvé la solution. J'avais besoin d'importer express dans mon augmentation de type et de faire en sorte que mon augmentation renvoie express.Response :

import { SomeType } from '...';
import express from 'express';

declare global {
    namespace Express {
        interface Response { 
        getSomeType(): SomeType;
        message(str: string): express.Response; 
    }
} 
0
Richard Walton 18 mars 2019 à 22:56

Peut-être que si vous écrivez comme ça, ce sera du travail :

import { SomeType } from '...';

declare namespace Express {
  export interface Response {
      getSomeType(): SomeType;
      message(str: string): Response; 
  }
}

Ici était une question similaire

2
Alex 18 mars 2019 à 19:18