টাইপসক্রিপ্ট ব্যবহার করে এক্সপ্রেস অনুরোধ অবজেক্টটি প্রসারিত করুন


128

আমি টাইপস্ক্রিপ্ট ব্যবহার করে মিডওয়্যার থেকে অনুরোধ অবজেক্টটি প্রকাশ করার জন্য একটি সম্পত্তি যুক্ত করার চেষ্টা করছি। তবে আমি কীভাবে বস্তুর অতিরিক্ত বৈশিষ্ট্য যুক্ত করব তা বুঝতে পারি না। আমি যদি সম্ভব হয় তবে বন্ধনী স্বরলিপি ব্যবহার না করাকে পছন্দ করব।

আমি এমন একটি সমাধান খুঁজছি যা আমাকে এর সাথে অনুরূপ কিছু লিখতে দেয় (যদি সম্ভব হয়):

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

এক্সপ্রেস.ড.টি.এস. ফাইল আপনার যে ক্ষেত্রগুলি সরবরাহ করে তা আপনার অনুরোধ ইন্টারফেসটি প্রসারিত করতে সক্ষম হওয়া উচিত।
টস্কভ

উত্তর:


146

আপনি একটি কাস্টম সংজ্ঞা তৈরি করতে এবং টাইপস্ক্রিপ্টে ডিক্লারেশন মার্জিং নামে একটি বৈশিষ্ট্য ব্যবহার করতে চান । এটি সাধারণত ব্যবহৃত হয়, যেমন ইন method-override

একটি ফাইল তৈরি করুন custom.d.tsএবং আপনার অন্তর্ভুক্ত করতে ভুলবেন না tsconfig.jsonএর files-অধ্যায় যদি থাকে। বিষয়বস্তুগুলি নিম্নলিখিত হিসাবে দেখতে পারে:

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 এর ফাইল বিভাগে যুক্ত না করেই এটি কাজ করে চলেছি, তবুও এটি কার্যকর রয়েছে। এই প্রত্যাশিত আচরণ?
চেইম ফ্রিডম্যান

1
পছন্দ করুন filesঅধ্যায় টাইপ করা বিষয় দ্বারা অন্তর্ভুক্ত ফাইলের সেট নিষিদ্ধ। আপনি যদি নির্দিষ্ট না করেন filesবা না করেন include, তবে সমস্তই *.d.tsডিফল্টরূপে অন্তর্ভুক্ত থাকে, সুতরাং সেখানে আপনার কাস্টম টাইপগুলি যুক্ত করার দরকার নেই।
ইন্টারফেক্স

9
আমার পক্ষে কাজ করছেন না: আমি Property 'tenant'অনুরোধ' টাইপ করে পাই না `আমি যদি স্পষ্টভাবে এটিতে অন্তর্ভুক্ত করি tsconfig.jsonবা না করি তবে কোনও তফাত হবে না। আপডেট সঙ্গে declare global@basarat pointet হিসেবে তাঁর answear কাজে বাইরে, কিন্তু আমি কি ছিল import {Request} from 'express'প্রথম।
সিংহ

5
FWIW, এই উত্তরটি এখন অপ্রচলিত । জিসিএম এর উত্তর হ'ল 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!'))

বিশ্বব্যাপী নেমস্পেসগুলি প্রসারিত করা আমার গিটবুকটিতে আরও কভার করা হয়েছে


ঘোষণায় কেন বিশ্বব্যাপী প্রয়োজন? সেখানে না থাকলে কী হয়?
জেসন কুহার্ট

এটি ইন্টারফেসের সাথে কাজ করে, তবে যে কারও ক্ষেত্রে প্রকারগুলি মার্জ করার প্রয়োজন রয়েছে তা নোট করুন যে প্রকারগুলি "বন্ধ" রয়েছে এবং একত্রীকরণ করা যায় না: github.com/Mic Microsoft
পিটার ডাব্লু

মিঃ @ বাসারত আমি আপনার কিছু বিয়ার পাওনা।
মার্সেলসিমন

আমাকে আমার tsconfig.json: {"সংকলক অপশন": type "টাইপরুটস": ["./src/typings/", "./node_modules/@tyype"] pes, "ফাইল": ["। / src / typings / express / index.d.ts "]}
মার্সেলসিমোন

উপরের সমাধানগুলির কোনওটিই কাজ করেনি .. তবে এই প্রথমটি কাজটি করেছে .. অনেক অনেক ধন্যবাদ .. !!
রীতেশ

55

এক্সপ্রেসের নতুন সংস্করণগুলির জন্য আপনাকে express-serve-static-coreমডিউলটি বৃদ্ধি করতে হবে ।

এটি প্রয়োজন কারণ এখন সেখান থেকে এক্সপ্রেস অবজেক্টটি আসে: https://github.com/DefinitelyTypeed/DefinitelyTypeed/blob/8fb0e959c2c7529b5fa4793a44b41b797ae671b9/tyype/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";
এটির

1
@ Andre_b ইঙ্গিতটির জন্য ধন্যবাদ। আমি মনে করি আমদানি বিবৃতি ফাইলটিকে একটি মডিউলে রূপান্তরিত করে, এবং এটি প্রয়োজনীয় অংশ। আমি export {}যা ব্যবহার করে তা পরিবর্তন করতে চলেছি ।
দানিয়াল আয়তেকিন

2
নিশ্চিত ফাইলটি এই কোডে হয় যায় করুন না বলা express.d.ts, অন্যথায় কম্পাইলার দ্রুতগামী typings করার জন্য এই একত্রীকরণ, ত্রুটি ফলে চেষ্টা করবে।
টম স্পেন্সার

3
আপনার ধরণগুলি অবশ্যই টাইপরুটগুলিতে প্রথম হতে হবে তা নিশ্চিত করুন! ধরনের / প্রকাশ করার / index.d.ts এবং tsconfig => "typeRoots": [ "./src/types", "./node_modules/@types"]
Kaya

30

গৃহীত উত্তর (অন্য হিসাবে) আমার পক্ষে কাজ করে না তবে

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

করেছিল. আশা করি যে কাউকে সাহায্য করবে।


2
"মডিউল অগমেন্টেশন" এর অধীনে ts ডক্সে অনুরূপ পদ্ধতি বর্ণনা করা হয়েছে । আপনি যদি *.d.tsফাইলগুলি ব্যবহার করতে না চান এবং আপনার প্রকারগুলি নিয়মিত *.tsফাইলের মধ্যে সঞ্চয় করতে না চান তবে এটি দুর্দান্ত ।
im.pankratov

3
এটিই আমার পক্ষে কাজ করেছে, অন্য সমস্ত উত্তরগুলি .d.ts ফাইলগুলিতে থাকা দরকার বলে মনে হচ্ছে
সংসদ

এটি আমার custom-declarations.d.tsপক্ষেও কাজ করে, তবে শর্ত থাকে যে আমি আমার ফাইলটি টাইপস্ক্রিপ্টের প্রকল্পের মূলটিতে রেখেছি ।
ফোকরনার

আমি সংরক্ষণের জন্য মূল ধরণটি প্রসারিত করেছি: import { Request as IRequest } from 'express/index';এবং interface Request extends IRequest। টাইপ রুটটি যুক্ত করতে হয়েছিল
বেন

17

8 বা তার বেশি উত্তর দেওয়ার পরেও সাফল্য না পেয়ে। আমি অবশেষে 3dd রপোর দিকে ইঙ্গিত করে 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
এটি কার্যকর হবে, তবে আপনার যদি প্রায় 100s মিডলওয়্যার ফাংশন থাকে তবে বেশ ভার্জোজ, এমিরাইট
আলেকজান্ডার মিলস 3

1
@ ব্যবহারকারী 2473015 হ্যাঁ, টাইপস্ক্রিপ্টের সাম্প্রতিক সংস্করণগুলি এটি ভেঙেছে। আমার আপডেট হওয়া উত্তরটি দেখুন।
টম মেটাম

8

টাইপস্ক্রিপ্টে, ইন্টারফেসগুলি খোলা সমাপ্ত হয়। এর অর্থ আপনি যে কোনও জায়গা থেকে তাদের পুনরায় সংজ্ঞায়িত করে সম্পত্তি যুক্ত করতে পারেন।

আপনি এই এক্সপ্রেস.ডি.টি.এস ফাইলটি ব্যবহার করছেন তা বিবেচনা করে অতিরিক্ত ক্ষেত্র যুক্ত করার জন্য আপনার অনুরোধ ইন্টারফেসটিকে নতুন করে সংজ্ঞায়িত করতে সক্ষম হওয়া উচিত ।

interface Request {
  property: string;
}

তারপরে আপনার মিডওয়্যার ফাংশনে, রেক প্যারামিটারেরও এই সম্পত্তি থাকা উচিত। আপনার কোডে কোনও পরিবর্তন ছাড়াই আপনার এটি ব্যবহার করতে সক্ষম হওয়া উচিত।


1
কীভাবে আপনি আপনার কোড জুড়ে সেই তথ্য "ভাগ" করেন? যদি আমি অনুরোধে একটি সম্পত্তি সংজ্ঞায়িত বলতে Request.user = {};মধ্যে app.tsকীভাবে userController.tsএটি সম্পর্কে জানেন?
নেপোকক্সেক্স

2
@ নেপক্সএক্স আপনি যদি কোনও ইন্টারফেসটিকে নতুনভাবে সংজ্ঞায়িত করেন তবে সংকলক বৈশিষ্ট্যগুলিকে একীভূত করবে এবং এগুলি সর্বত্র দৃশ্যমান করে দেবে, এ কারণেই। আদর্শভাবে আপনি একটি .d.ts ফাইলে পুনরায় সংজ্ঞাটি করতে চান। :)
toskv

এটি কাজ করে বলে মনে হচ্ছে, তবে আমি যদি টাইপটি ব্যবহার করি express.Handler(ম্যানুয়ালি নির্দিষ্ট করার পরিবর্তে (req: express.Request, res: express.Response, next: express.NextFunction) => any)), এটি Requestআমার সম্পত্তিটির অস্তিত্ব নেই বলে অভিযোগ করায় এটি একই রকম উল্লেখ করে বলে মনে হয় না।
নেপোকক্সেক্স

এক্সপ্রেস না হলে আমি এটার প্রত্যাশা করব না and হ্যান্ডলার অনুরোধ ইন্টারফেসটি প্রসারিত করে। এটা কি পারে?
toskv

2
আমি যদি কাজটি করতে পারি তবে আমি এটি ব্যবহার declare module "express"করতে পারি তবে আমি ব্যবহার করি না declare namespace Express। আমি বরং নেমস্পেস সিনট্যাক্স ব্যবহার করব তবে এটি আমার পক্ষে কার্যকর হয় না।
উইলিসি

5

যদিও এটি খুব পুরানো প্রশ্ন, আমি ইদানীং এই সমস্যায় পড়েছি accepted গ্রহণযোগ্য উত্তরটি ঠিক কাজ করে তবে আমার একটি কাস্টম ইন্টারফেস যুক্ত করা দরকার Request- একটি ইন্টারফেস যা আমার কোডটিতে আমি ব্যবহার করছিলাম এবং এটি গ্রহণযোগ্যদের সাথে এতটা ভাল কাজ করে নি that উত্তর. যৌক্তিকভাবে, আমি এটি চেষ্টা করেছি:

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- উপেক্ষা করে যুক্ত করি তবে এটি কার্যকর হয় (যদিও এটি অবশ্যই এটি ঠিক করার একটি নির্বোধ উপায় why কেন এটি হতে পারে না সে সম্পর্কে আপনার কোনও ধারণা আছে? আমার অন্যান্য ফাইলের জন্য কাজ করছেন?
লোগান

এটি একটি খুব অদ্ভুত জিনিস @ লোগান। আপনি আপনার ভাগ করতে পারি .d.ts, tsconfig.jsonএবং ব্যবহার উদাহরণস্বরূপ? এছাড়াও, বিশ্বব্যাপী মডিউলগুলিতে এই আমদানিটি কেবল টিএস ২.৯ থেকে শুরু করে সমর্থন করা হিসাবে আপনি কোন ধরণের টাইপস্ক্রিপ্ট ব্যবহার করছেন? এটি আরও ভাল সাহায্য করতে পারে।
16kb

আমি এখানে ডেটা আপলোড করেছি, পেস্টবিন.কম / পিএনএমআরআর 1 জেআর আমি নিশ্চিত নই যে হাইলাইটিংটি সমস্ত কেন গণ্ডগোল হয়েছে যদিও এটি মূল ফাইল prnt.sc/n6xsyl এর থেকে, এটি অন্য ফাইল থেকে এসেছে prnt.sc/n6xtp0 স্পষ্টতই এর কিছু অংশ রয়েছে এটি বোঝা যাচ্ছে যা চলছে, কিন্তু সংকলকটি তা করে না। আমি টাইপস্ক্রিপ্টের ৩.২.২ সংস্করণটি ব্যবহার করছি
লোগান

1
অলৌকিকভাবে, ... "include": [ "src/**/*" ] ...আমার জন্য কাজ "include": ["./src/", "./src/Types/*.d.ts"],করে কিন্তু না। আমি এটি এখনও বুঝতে চেষ্টা করে যেতে পারি নি
16kb

গতিশীল আমদানি ব্যবহার করে ইন্টারফেস আমদানি করা আমার পক্ষে কাজ করে। ধন্যবাদ
রোমান মাহোৎস্কি

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 হতে হবে

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- ডাবল castালাই

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

ডাবল কাস্টিং এর সুবিধাগুলি হ'ল:

  • টাইপিং উপলব্ধ
  • এটি বিদ্যমান সংজ্ঞাগুলিকে দূষিত করে না তবে বিভ্রান্তি এড়িয়ে এগুলি প্রসারিত করে
  • theালাই সুস্পষ্ট হওয়ায় এটি -noImplicitanyপতাকা দিয়ে জরিমানা সংকলন করে

বিকল্পভাবে, দ্রুত (অ-টাইপযুক্ত) রুট রয়েছে:

 req['myProperty'] = setProperty()

(আপনার নিজস্ব বৈশিষ্ট্য সহ বিদ্যমান সংজ্ঞা ফাইলগুলি সম্পাদনা করবেন না - এটি কল্পনাযোগ্য নয় the সংজ্ঞাগুলি যদি ভুল হয় তবে একটি টানার অনুরোধটি খুলুন)

সম্পাদনা

নীচে মন্তব্য দেখুন, সহজ কাস্টিং এই ক্ষেত্রে কাজ করে req as MyRequest


@ আকাশ এই ক্ষেত্রে, হ্যাঁ, কারণ MyRequestপ্রসারিত http.IncomingMessage। এটি anyএমনটি ছিল না, দ্বৈত
castালাইয়ের

এটির পরিবর্তে আপনি অজানাতে কাস্ট করার পরামর্শ দেওয়া হয়।
দেব

0

এই উত্তরটি যারা এনপিএম প্যাকেজের উপর নির্ভর করে তাদের পক্ষে উপকারী হবে 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 কোনও কম্পাইলারের ।

শুরু আপডেট করা হচ্ছে scriptpackage.jsonএটা আমার জন্য ঠিক করেছি।

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

দ্য --filesআর্গুমেন্ট এখানে একটি গুরুত্বপূর্ণ ভূমিকা পালন কাস্টম টাইপ সংজ্ঞা নির্ধারণের পাবেন।

আরও তথ্যের জন্য দয়া করে এখানে যান: https://github.com/TypeStrong/ts-node#help-my-tyype-are-missing


0

এক্সপ্রেসজেএস'র অনুরোধটি বাড়ানোর চেষ্টা করার সময় ২০২০ সালের মে মাসের শেষদিকে আমার জন্য যে কাজ করে যাবার জন্য অন্য যে কোনও কিছু সন্ধান করতে সহায়তা করা সেটাই ছিল। এটি কাজ করার আগে আমাকে এক ডজনেরও বেশি জিনিস চেষ্টা করতে হয়েছিল:

  • আপনার tsconfig.json এর "টাইপরুটস" -তে প্রত্যেকে কী পরামর্শ দিচ্ছে তার ক্রমটি ফ্লিপ করুন (এবং tsconfig যেমন আপনার "./src" তে কোনও রুটডির সেটিংস থাকলে src পাথটি বাদ দিতে ভুলবেন না)। উদাহরণ:
"typeRoots": [
      "./node_modules/@types",
      "./your-custom-types-dir"
]
  • কাস্টম এক্সটেনশনের উদাহরণ ('./Your-custom-tyype-dir/express/index.d.ts ")। আমার অভিজ্ঞতার ক্ষেত্রে ক্লাস ব্যবহার করতে আমাকে ইনলাইন আমদানি এবং ডিফল্ট রফতানি ব্যবহার করতে হয়েছিল যাতে এটিও দেখানো হয়:
declare global {
  namespace Express {
    interface Request {
      customBasicProperty: string,
      customClassProperty: import("../path/to/CustomClass").default;
    }
  }
}
  • Ts-node এ "--files" কমান্ড যুক্ত করতে আপনার nodemon.json ফাইল আপডেট করুন:
{
  "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( এটি দেখতে অবশ্যই পছন্দ করুন)
  4. অবশেষে ধরণের এক্সটেনশানটি তৈরি করার জন্য আপনাকে কেবল নীচের মতো একটি কোড রাখা দরকার:
declare module 'express' {
    export interface Request {
        property?: string;
    }
}

-2

উপরের স্বীকৃত উত্তরের মতো আমাদের কেন এত ঝামেলা করা দরকার, যখন আমরা কেবল এটি করে পালিয়ে যেতে পারি

অনুরোধে আমাদের সম্পত্তি সংযুক্ত করার পরিবর্তে , আমরা এটি শিরোনামগুলির অনুরোধে সংযুক্ত করতে পারি

   req.headers[property] = "hello"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.