टाइपस्क्रिप्ट का उपयोग करके एक्सप्रेस अनुरोध वस्तु का विस्तार करें


128

मैं टाइपस्क्रिप्ट का उपयोग करके एक मिडलवेयर से अनुरोध ऑब्जेक्ट को व्यक्त करने के लिए एक संपत्ति जोड़ने की कोशिश कर रहा हूं। हालाँकि मैं यह पता नहीं लगा सकता कि वस्तु में अतिरिक्त गुण कैसे जोड़े जाएँ। यदि संभव हो तो मैं ब्रैकेट नोटेशन का उपयोग नहीं करना चाहूंगा।

मैं एक ऐसा समाधान ढूंढ रहा हूं, जो मुझे इस तरह से कुछ लिखने की अनुमति दे (यदि संभव हो):

app.use((req, res, next) => {
    req.property = setProperty(); 
    next();
});

आपके द्वारा अनुरोधित इंटरफ़ेस को विस्तारित करने में सक्षम होना चाहिए जो एक्सप्रेस। tts फ़ाइल आपके इच्छित फ़ील्ड के साथ प्रदान करता है।
टॉस्क

जवाबों:


147

आप एक कस्टम परिभाषा बनाना चाहते हैं, और Declaration Merging नामक टाइपस्क्रिप्ट में एक सुविधा का उपयोग करना चाहते हैं । यह आमतौर पर उपयोग किया जाता है, उदाहरण के लिए method-override

एक फ़ाइल बनाएँ custom.d.tsऔर अपने में शामिल करने के लिए सुनिश्चित करें tsconfig.jsonकी files-section यदि कोई हो। सामग्री इस प्रकार देख सकते हैं:

declare namespace Express {
   export interface Request {
      tenant?: string
   }
}

यह आपके कोड के किसी भी बिंदु पर आपको कुछ इस तरह से उपयोग करने की अनुमति देगा:

router.use((req, res, next) => {
    req.tenant = 'tenant-X'
    next()
})

router.get('/whichTenant', (req, res) => {
    res.status(200).send('This is your tenant: '+req.tenant)
})

2
मैंने अभी-अभी यह किया है, लेकिन मुझे अपने tsconfig.json में फ़ाइल अनुभाग में अपनी custom.d.ts फ़ाइल को जोड़े बिना यह काम मिला, फिर भी यह अभी भी काम करता है। क्या यह अपेक्षित व्यवहार है?
चैम फ्राइडमैन

1
@ChaimFriedman हां। filesअनुभाग टाइपप्रति रूप से शामिल फ़ाइलों के सेट पर प्रतिबंध है। यदि आप निर्दिष्ट नहीं करते हैं filesया नहीं करते हैं include, तो सभी *.d.tsडिफ़ॉल्ट रूप से शामिल होते हैं, इसलिए वहां आपके कस्टम टाइपिंग को जोड़ने की कोई आवश्यकता नहीं है।
इंटरफैक्स

9
मेरे लिए काम नहीं कर रहा है: मुझे Property 'tenant'टाइप' मौजूद नहीं है 'अनुरोध' में कोई फर्क नहीं पड़ता है अगर मैं स्पष्ट रूप से इसे शामिल करता हूं tsconfig.jsonया नहीं। अद्यतन के declare globalरूप में @basarat बिंदु के साथ अपने उत्तर में काम करता है, लेकिन मुझे import {Request} from 'express'पहले करना था ।
शेर

5
एफडब्ल्यूआईडब्ल्यू, यह जवाब अब अप्रचलित है । JCM का उत्तर Requestएक्सप्रेस में वस्तु को बढ़ाने का सही तरीका है (4.x कम से कम)
एरिक लिपरांडी

3
भविष्य की खोजों के लिए - एक अच्छा उदाहरण मैंने पाया कि बॉक्स से बाहर काम किया: github.com/3mard/ts-node-example
jd291

79

जैसा कि टिप्पणियों मेंindex.d.ts सुझाया गया है , आप बस वैश्विक Expressनेमस्पेस को किसी नए सदस्य की घोषणा करते हैं। उदाहरण:

declare global {
  namespace Express {
    interface Request {
      context: Context
    }
  }
}

पूर्ण उदाहरण:

import * as express from 'express';

export class Context {
  constructor(public someContextVariable) {
  }

  log(message: string) {
    console.log(this.someContextVariable, { message });
  }
}

declare global {
  namespace Express {
    interface Request {
      context: Context
    }
  }
}

const app = express();

app.use((req, res, next) => {
  req.context = new Context(req.url);
  next();
});

app.use((req, res, next) => {
  req.context.log('about to return')
  res.send('hello world world');
});

app.listen(3000, () => console.log('Example app listening on port 3000!'))

वैश्विक नामस्थान का विस्तार मेरे GitBook पर अधिक कवर किया गया है ।


घोषणा में वैश्विक की आवश्यकता क्यों है? अगर इसके नहीं होने पर क्या होता है?
जेसन कुहरट

यह इंटरफेस के साथ काम करता है, लेकिन किसी को भी प्रकार को मर्ज करने की आवश्यकता होती है, ध्यान दें कि प्रकार "बंद" हैं और विलय नहीं किया जा सकता है: github.com/Microsoft/TypeScript/issues/…
पीटर डब्ल्यू

श्री @basarat मैं तुम्हें कुछ बियर देना है।
marcellsimon

मुझे अपने tsconfig.json: {"compilerOptions": {"typeRoots": ["//src/typings/ "," ./node_modules/@yypes "]}," files ": ["/" में भी जोड़ना था। src / टाइपिंग / एक्सप्रेस / index.d.ts "]}
marcellsimon

उपरोक्त समाधान में से किसी ने भी काम नहीं किया .. लेकिन इसने पहली बार में काम किया .. बहुत बहुत धन्यवाद .. !!
रितेश

55

एक्सप्रेस के नए संस्करणों के लिए, आपको express-serve-static-coreमॉड्यूल को बढ़ाने की आवश्यकता है ।

इसकी आवश्यकता है क्योंकि अब एक्सप्रेस ऑब्जेक्ट वहां से आता है: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/8fb0e959c2c7529b5fa4793a444441b797ae671b9/types/express/index.d.ts#L19

मूल रूप से, निम्नलिखित का उपयोग करें:

declare module 'express-serve-static-core' {
  interface Request {
    myField?: string
  }
  interface Response {
    myField?: string
  }
}

1
यह मेरे लिए काम आया, जबकि सादे-पुराने 'express'मॉड्यूल का विस्तार नहीं हुआ। धन्यवाद!
बेन क्रीगर

4
इसके साथ संघर्ष कर रहा था, इसे काम करने के लिए, मुझे मॉड्यूल भी आयात करना पड़ा:import {Express} from "express-serve-static-core";
andre_b

1
@andre_b संकेत के लिए धन्यवाद। मुझे लगता है कि आयात विवरण फ़ाइल को एक मॉड्यूल में बदल देता है, और यह वह हिस्सा है जो आवश्यक है। मैंने उपयोग करने के लिए स्विच किया है export {}जो भी काम करता है।
डेनियल आयटेकिन

2
सुनिश्चित करें कि यह कोड जिस फ़ाइल में जाता है उसे कॉल नहीं किया जाता है express.d.ts, अन्यथा कंपाइलर इसे एक्सप्रेस टाइपिंग में मर्ज करने का प्रयास करेगा, जिसके परिणामस्वरूप त्रुटियां हो सकती हैं।
टॉम स्पेन्सर

3
सुनिश्चित करें कि आपके प्रकार टाइपरूट्स में पहले होने चाहिए! प्रकार / एक्सप्रेस / index.d.ts और tsconfig => "typeRoots": ["./src/types", "./node_modules/@types"]
kaya

30

स्वीकृत उत्तर (दूसरों के रूप में) मेरे लिए काम नहीं करता है लेकिन

declare module 'express' {
    interface Request {
        myProperty: string;
    }
}

किया। आशा है कि किसी की मदद करेंगे।


2
इसी तरह की विधि टीएस डॉक्स में "मॉड्यूल ऑग्मेंटेशन" के तहत वर्णित है । यदि आप *.d.tsफ़ाइलों का उपयोग नहीं करना चाहते हैं और नियमित *.tsफ़ाइलों के भीतर अपने प्रकारों को संग्रहीत करना चाहते हैं तो यह बहुत अच्छा है ।
im.pankratov

3
यह केवल एक चीज है जो मेरे लिए भी काम करती है, अन्य सभी उत्तरों के लिए .dts फ़ाइलों की आवश्यकता प्रतीत होती है
संसद

यह मेरे लिए भी काम करता है, बशर्ते मैं अपनी custom-declarations.d.tsफ़ाइल टाइपस्क्रिप्ट प्रोजेक्ट रूट में डालूँ।
फ़ोकॉर्नर

मैंने इसे संरक्षित करने के लिए मूल प्रकार बढ़ाया: import { Request as IRequest } from 'express/index';और interface Request extends IRequest। इसके अलावा टाइपरूट को जोड़ना था
बेन

17

8 या तो जवाब देने की कोशिश करने और एक सफलता नहीं होने के बाद। मैं अंत में इसे 3dards रेपो की ओर इशारा करते हुए jd291 की टिप्पणी के साथ काम करने में कामयाब रहा ।

आधार नामक फाइल बनाएं types/express/index.d.ts। और इसमें लिखें:

declare namespace Express {
    interface Request {
        yourProperty: <YourType>;
    }
}

और इसे इसमें शामिल tsconfig.jsonकरें:

{
    "compilerOptions": {
        "typeRoots": ["./types"]
    }
}

फिर yourPropertyहर अनुरोध के तहत सुलभ होना चाहिए:

import express from 'express';

const app = express();

app.get('*', (req, res) => {
    req.yourProperty = 
});

14

मेरे लिए प्रस्तावित समाधानों में से किसी ने भी काम नहीं किया। मैंने केवल अनुरोध इंटरफ़ेस का विस्तार किया:

import {Request} from 'express';

export interface RequestCustom extends Request
{
    property: string;
}

फिर इसका उपयोग करने के लिए:

import {NextFunction, Response} from 'express';
import {RequestCustom} from 'RequestCustom';

someMiddleware(req: RequestCustom, res: Response, next: NextFunction): void
{
    req.property = '';
}

संपादित करें : टाइपस्क्रिप्ट के हाल के संस्करण इस बारे में शिकायत करते हैं। इसके बजाय, मुझे करना था:

someMiddleware(expressRequest: Request, res: Response, next: NextFunction): void
{
    const req = expressRequest as RequestCustom;
    req.property = '';
}

1
यह काम करेगा, लेकिन काफी क्रियात्मक है यदि आपके पास मिडलवेयर फ़ंक्शंस के 100 हैं, तो एमीराईट
अलेक्जेंडर मिल्स

1
@ user2473015 हाँ, टाइपस्क्रिप्ट के हाल के संस्करणों ने इसे तोड़ दिया। देखिये मेरा अपडेटेड जवाब।
टॉम मेट्टम

8

टाइपस्क्रिप्ट में, इंटरफेस खुले समाप्त होते हैं। इसका मतलब है कि आप उन्हें केवल फिर से परिभाषित करके कहीं से भी गुण जोड़ सकते हैं।

यह देखते हुए कि आप इस express.d.ts फ़ाइल का उपयोग कर रहे हैं , आपको अतिरिक्त फ़ील्ड को जोड़ने के लिए अनुरोध इंटरफ़ेस को फिर से परिभाषित करने में सक्षम होना चाहिए ।

interface Request {
  property: string;
}

फिर आपके मिडलवेयर फ़ंक्शन में, रेक पैरामीटर के पास यह संपत्ति भी होनी चाहिए। आपको अपने कोड में बिना किसी बदलाव के इसका उपयोग करने में सक्षम होना चाहिए।


1
आप अपने कोड में उस जानकारी को "साझा" कैसे करते हैं? यदि मैं अनुरोध में एक संपत्ति को परिभाषित करता हूं, तो कहो कि इसके बारे Request.user = {};में app.tsकैसे userController.tsपता चलता है ?
नेपॉक्सएक्स

2
@Nepoxx यदि आप एक इंटरफ़ेस को फिर से परिभाषित करते हैं तो कंपाइलर गुणों को मर्ज करेगा और उन्हें हर जगह दिखाई देगा, इसीलिए। आदर्श रूप से आप .d.ts फ़ाइल में पुनर्वितरण करेंगे। :)
toskv

यह काम करने लगता है, हालांकि अगर मैं टाइप express.Handler(मैन्युअल रूप से निर्दिष्ट करने के बजाय (req: express.Request, res: express.Response, next: express.NextFunction) => any)) का उपयोग करता हूं , तो यह उसी के संदर्भ में नहीं लगता है Requestक्योंकि यह शिकायत करता है कि मेरी संपत्ति मौजूद नहीं है।
नेपॉक्सक्स

मैं यह उम्मीद नहीं करूंगा, जब तक कि व्यक्त नहीं किया जाए। हैंडलर अनुरोध इंटरफ़ेस का विस्तार करता है। क्या यह?
toskv 14

2
अगर मैं उपयोग करता हूं तो मैं वह काम कर सकता हूं declare module "express"लेकिन अगर मैं उपयोग करता हूं तो नहीं declare namespace Express। मैं नाम स्थान वाक्यविन्यास का उपयोग करूँगा, लेकिन यह सिर्फ मेरे लिए काम नहीं करता है।
विली

5

हालांकि यह एक बहुत पुराना सवाल है, मैं हाल ही में इस समस्या पर अड़ गया हूं। स्वीकृत उत्तर ठीक काम करता है, लेकिन मुझे एक कस्टम इंटरफ़ेस जोड़ने की आवश्यकता है Request- एक इंटरफ़ेस जो मैं अपने कोड में उपयोग कर रहा था और जो स्वीकृत के साथ इतनी अच्छी तरह से काम नहीं करता था जवाब। तार्किक रूप से, मैंने यह कोशिश की:

import ITenant from "../interfaces/ITenant";

declare namespace Express {
    export interface Request {
        tenant?: ITenant;
    }
}

लेकिन यह काम नहीं किया क्योंकि टाइपस्क्रिप्ट व्यवहार करता है .d.ts फ़ाइलों को वैश्विक आयात के रूप में और जब उनके आयात होते हैं तो उन्हें सामान्य मॉड्यूल के रूप में माना जाता है। यही कारण है कि ऊपर का कोड मानक टाइपस्क्रिप्ट सेटिंग पर काम नहीं करता है।

यहाँ है कि मैं क्या कर समाप्त हो गया

// typings/common.d.ts

declare namespace Express {
    export interface Request {
        tenant?: import("../interfaces/ITenant").default;
    }
}
// interfaces/ITenant.ts

export interface ITenant {
    ...
}

यह मेरी मुख्य फ़ाइल के लिए काम करता है, लेकिन मेरी रूटिंग फ़ाइलों या नियंत्रकों में नहीं, मुझे कोई लाइनिंग नहीं मिलती है, लेकिन जब मैं इसे संकलित करने का प्रयास करता हूं, तो यह कहता है कि "संपत्ति 'उपयोगकर्ता का प्रकार' अनुरोध 'पर मौजूद नहीं है।" (मैं किरायेदार के बजाय उपयोगकर्ता का उपयोग कर रहा हूं), लेकिन अगर मैं उनके ऊपर // @ ts-उपेक्षा जोड़ता हूं, तो यह काम करता है (हालांकि यह निश्चित रूप से इसे ठीक करने का एक मूर्खतापूर्ण तरीका है। क्या आपके पास कोई विचार है कि यह क्यों नहीं हो सकता है। मेरी अन्य फाइलों के लिए काम कर रहे हैं?
लोगान

वो बड़ी अजीब बात है @ लोगन। आप अपने साझा कर सकते हैं .d.ts, tsconfig.jsonऔर उपयोग उदाहरण? साथ ही, वैश्विक मॉड्यूल में आयात करने वाले टाइपस्क्रिप्ट का आप किस संस्करण का उपयोग कर रहे हैं, केवल टीएस 2.9 से शुरू होने का समर्थन है? इससे बेहतर मदद मिल सकती है।
16kb

मैंने यहां डेटा अपलोड किया है, pastebin.com/0npmR1Zr मुझे यकीन नहीं है कि हाइलाइटिंग सभी गड़बड़ क्यों है हालांकि यह मुख्य फ़ाइल prnt.sc/n6xsyl से है यह एक अन्य फ़ाइल से है prnt.sc/n6xtp0 स्पष्ट रूप से कुछ हिस्सा यह समझता है कि क्या चल रहा है, लेकिन संकलक नहीं करता है। मैं टाइपिंग के 3.2.2 संस्करण का उपयोग कर रहा हूं
लोगान

1
आश्चर्य की बात है, ... "include": [ "src/**/*" ] ...मेरे लिए काम करता है , लेकिन "include": ["./src/", "./src/Types/*.d.ts"],नहीं है। मैं इसे समझने की कोशिश में अभी तक नहीं गया हूँ
16:05

गतिशील आयात का उपयोग करके इंटरफ़ेस आयात करना मेरे लिए काम करता है। धन्यवाद
रोमन Mahotskyi

3

हो सकता है कि इस मुद्दे का जवाब दे दिया गया हो, लेकिन मैं बस थोड़ा सा साझा करना चाहता हूं, अब कभी-कभी अन्य उत्तरों की तरह एक इंटरफ़ेस भी थोड़ा प्रतिबंधात्मक हो सकता है, लेकिन हम वास्तव में आवश्यक गुणों को बनाए रख सकते हैं और फिर एक जोड़कर अतिरिक्त गुणों को जोड़ सकते हैं। stringमूल्य के प्रकार के साथ कुंजीany

import { Request, Response, NextFunction } from 'express'

interface IRequest extends Request {
  [key: string]: any
}

app.use( (req: IRequest, res: Response, next: NextFunction) => {
  req.property = setProperty();

  next();
});

तो अब, हम किसी भी अतिरिक्त संपत्ति को भी जोड़ सकते हैं जो हम इस ऑब्जेक्ट को चाहते हैं।


2

यदि आप समाधान की तलाश कर रहे हैं जो एक्सप्रेस 4 के साथ काम करता है, तो यह है:

@ प्रकार / एक्सप्रेस / index.d.ts: -------- /index.d.ts होना चाहिए

declare namespace Express { // must be namespace, and not declare module "Express" { 
  export interface Request {
    user: any;
  }
}

tsconfig.json:

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es2016",
    "typeRoots" : [
      "@types", // custom merged types must be first in a list
      "node_modules/@types",
    ]
  }
}

से रेफरी https://github.com/TypeStrong/ts-node/issues/715#issuecomment-526757308


2

ये सभी प्रतिक्रियाएँ किसी न किसी तरह से गलत या पुरानी लगती हैं।

यह मेरे लिए मई, 2020 में काम आया:

में ${PROJECT_ROOT}/@types/express/index.d.ts:

import * as express from "express"

declare global {
    namespace Express {
        interface Request {
            my_custom_property: TheCustomType
        }
    }
}

में tsconfig.json, जोड़ें / विलय ऐसी है कि संपत्ति:

"typeRoots": [ "@types" ]

चीयर्स।


वेबपैक + डॉकर के साथ काम करता है, आयात * को निर्यात के साथ बदला जा सकता है {};
डूमल

1

एक संभव समाधान "डबल कास्टिंग को किसी भी" का उपयोग करना है

1- अपनी संपत्ति के साथ एक इंटरफ़ेस परिभाषित करें

export interface MyRequest extends http.IncomingMessage {
     myProperty: string
}

2- डबल कास्ट

app.use((req: http.IncomingMessage, res: http.ServerResponse, next: (err?: Error) => void) => {
    const myReq: MyRequest = req as any as MyRequest
    myReq.myProperty = setProperty()
    next()
})

डबल कास्टिंग के फायदे हैं:

  • टंकण उपलब्ध है
  • यह मौजूदा परिभाषाओं को प्रदूषित नहीं करता है, लेकिन भ्रम से बचने के लिए उन्हें विस्तारित करता है
  • चूंकि कास्टिंग स्पष्ट है, यह -noImplicitanyध्वज के साथ जुर्माना संकलित करता है

वैकल्पिक रूप से, त्वरित (अप्रकाशित) मार्ग है:

 req['myProperty'] = setProperty()

(मौजूदा परिभाषा फ़ाइलों को अपने गुणों के साथ संपादित न करें - यह अस्वीकार्य है। यदि परिभाषाएँ गलत हैं, तो एक पुल अनुरोध खोलें)

संपादित करें

नीचे टिप्पणी देखें, इस मामले में सरल कास्टिंग काम करता है req as MyRequest


@ आकाश इस मामले में, हां, क्योंकि MyRequestविस्तार करता है http.IncomingMessage। ऐसा नहीं था, डबल कास्टिंग के माध्यम anyसे एकमात्र विकल्प होगा
ब्रूनो ग्रिडर

यह अनुशंसा की जाती है कि आप किसी के बजाय अज्ञात के लिए डाल दें।
देव

0

यह उत्तर उन लोगों के लिए फायदेमंद होगा जो npm पैकेज पर भरोसा करते हैं ts-node

मैं अनुरोध वस्तु के विस्तार की इसी चिंता से भी जूझ रहा था , मैंने स्टैक-ओवरफ्लो में कई उत्तरों का पालन किया और नीचे दी गई रणनीति का पालन करके समाप्त हुआ।

मैंने निम्नलिखित निर्देशिका में एक्सप्रेस के लिए विस्तारित टाइपिंग की घोषणा की ।${PROJECT_ROOT}/api/@types/express/index.d.ts

declare namespace Express {
  interface Request {
    decoded?: any;
  }
}

तो मेरे tsconfig.jsonइस तरह से कुछ करने के लिए अद्यतन ।

{
  "compilerOptions": {
     "typeRoots": ["api/@types", "node_modules/@types"]
      ...
  }
}

उपरोक्त चरणों को करने के बाद भी, दृश्य स्टूडियो ने शिकायत करना बंद कर दिया, लेकिन दुर्भाग्य से, ts-nodeसंकलक अभी भी फेंक दिया करता था।

 Property 'decoded' does not exist on type 'Request'.

जाहिर है, अनुरोध वस्तु के ts-nodeलिए विस्तारित प्रकार की परिभाषा का पता लगाने में सक्षम नहीं था ।

आखिरकार, घंटों बिताने के बाद, जैसा कि मुझे पता था कि वीएस कोड शिकायत नहीं कर रहा था और टाइपिंग परिभाषाओं का पता लगाने में सक्षम था, जिसका अर्थ है कि कुछ गलत है ts-node

मेरे लिए इसे शुरू करने scriptमें अद्यतन करना package.json

"start": "ts-node --files api/index.ts",

--filesतर्क यहाँ एक महत्वपूर्ण भूमिका निभाते कस्टम प्रकार परिभाषाएं निर्धारित करने लगता है।

अधिक जानकारी के लिए कृपया देखें: https://github.com/TypeStrong/ts-node#help-my-types-are-missing


0

किसी ऐसे व्यक्ति की मदद करने के लिए जो यहां सिर्फ कोशिश करने के लिए कुछ और देख रहा है, एक्सप्रेसजेएस के अनुरोध को आगे बढ़ाने के लिए 2020 के मई के अंत में मेरे लिए काम किया। मुझे यह काम करने से पहले एक दर्जन से अधिक चीजों की कोशिश करनी थी:

  • अपने tsconfig.json के "typeRoots" में सभी की सिफारिश करने के क्रम को पलटें (और यदि आप tsconfig जैसे "" .src "में रूटडायर सेटिंग करना चाहते हैं तो src पाथिंग को छोड़ना न भूलें")। उदाहरण:
"typeRoots": [
      "./node_modules/@types",
      "./your-custom-types-dir"
]
  • कस्टम एक्सटेंशन का उदाहरण ('./your-custom-types-dir/express/index.dts ")। मुझे अपने अनुभव में एक प्रकार के रूप में कक्षाओं का उपयोग करने के लिए इनलाइन आयात और डिफ़ॉल्ट निर्यात का उपयोग करना पड़ा, ताकि इसे भी दिखाया जाए:
declare global {
  namespace Express {
    interface Request {
      customBasicProperty: string,
      customClassProperty: import("../path/to/CustomClass").default;
    }
  }
}
  • अपने nodemon.json फ़ाइल को ts-node में "--files" कमांड जोड़ने के लिए अपडेट करें, उदाहरण:
{
  "restartable": "rs",
  "ignore": [".git", "node_modules/**/node_modules"],
  "verbose": true,
  "exec": "ts-node --files",
  "watch": ["src/"],
  "env": {
    "NODE_ENV": "development"
  },
  "ext": "js,json,ts"
}

0

इस उत्तर के लिए पहले से ही काफी देर हो सकती है, लेकिन वैसे भी यहाँ है कि मैंने कैसे हल किया:

  1. सुनिश्चित करें कि आपके पास आपकी tsconfigफ़ाइल में शामिल प्रकार के स्रोत हैं (यह एक नया धागा हो सकता है)
  2. अपने प्रकार निर्देशिका के अंदर एक नई निर्देशिका जोड़ें और उस पैकेज को नाम दें जिसे आप विस्तार करना चाहते हैं या इसके लिए प्रकार बनाना चाहते हैं। इस विशिष्ट मामले में, आप नाम के साथ एक निर्देशिका बनाएंगेexpress
  3. expressनिर्देशिका के अंदर एक फ़ाइल बनाएं और उसे नाम देंindex.d.ts (MUST BE EXACTLY LIKE THAT)
  4. अंत में उन प्रकारों का विस्तार करने के लिए जिन्हें आपको निम्नलिखित की तरह कोड डालने की आवश्यकता है:
declare module 'express' {
    export interface Request {
        property?: string;
    }
}

-2

हमें उक्त स्वीकृत उत्तरों के लिए इतनी परेशानी करने की क्या आवश्यकता है, जब हम ऐसा करने से दूर हो सकते हैं

अनुरोध करने के लिए अपनी संपत्ति को संलग्न करने के बजाय , हम इसे हेडर का अनुरोध करने के लिए संलग्न कर सकते हैं

   req.headers[property] = "hello"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.