ขยายวัตถุคำขอด่วนโดยใช้ typescript


129

ฉันพยายามเพิ่มคุณสมบัติเพื่อแสดงวัตถุคำขอจากมิดเดิลแวร์โดยใช้ typescript อย่างไรก็ตามฉันไม่สามารถหาวิธีเพิ่มคุณสมบัติพิเศษให้กับวัตถุได้ ฉันไม่ต้องการใช้เครื่องหมายวงเล็บถ้าเป็นไปได้

ฉันกำลังมองหาวิธีแก้ปัญหาที่จะช่วยให้ฉันสามารถเขียนสิ่งที่คล้ายกันนี้ได้ (ถ้าเป็นไปได้):

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

คุณควรจะสามารถขยายอินเตอร์เฟสการร้องขอที่ไฟล์ express.d.ts จัดเตรียมฟิลด์ที่คุณต้องการได้
toskv

คำตอบ:


148

คุณต้องการที่จะสร้างนิยามที่กำหนดเองและใช้คุณลักษณะใน typescript เรียกว่าปฏิญญาผสาน ซึ่งมักใช้กันทั่วไปเช่นในmethod-override.

สร้างไฟล์custom.d.tsและให้แน่ใจว่าจะรวมไว้ในของคุณtsconfig.json's 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
ฉันเพิ่งทำสิ่งนี้ แต่ฉันใช้งานได้โดยไม่ต้องเพิ่มไฟล์ custom.d.ts ลงในส่วนไฟล์ใน tsconfig.json ของฉัน แต่มันก็ยังใช้งานได้ เป็นพฤติกรรมที่คาดหวังหรือไม่?
Chaim Friedman

1
@ChaimFriedman ค่ะ filesส่วน จำกัด ชุดของแฟ้มรวมโดย typescript หากคุณไม่ระบุfilesหรือincludeทั้งหมด*.d.tsจะรวมไว้โดยค่าเริ่มต้นดังนั้นไม่จำเป็นต้องเพิ่มการพิมพ์ที่กำหนดเองที่นั่น
interphx

9
ไม่ได้ผลสำหรับฉัน: ฉันProperty 'tenantไม่ได้อยู่ในประเภท 'คำขอ' `` ไม่ได้สร้างความแตกtsconfig.jsonต่างหากฉันรวมไว้อย่างชัดเจนหรือไม่ UPDATEโดยdeclare globalที่ @basarat ชี้ให้เห็นในผลงาน answear ของเขา แต่ฉันต้องทำimport {Request} from 'express'ก่อน
สิงโต

5
FWIW คำตอบตอนนี้ล้าสมัย คำตอบของ JCM เป็นวิธีที่ถูกต้องในการเพิ่มRequestวัตถุในนิพจน์ (อย่างน้อย 4.x)
Eric Liprandi

3
สำหรับการค้นหาในอนาคต - ตัวอย่างที่ดีที่ฉันพบว่าทำงานนอกกรอบ: github.com/3mard/ts-node-example
jd291

80

ตามที่แนะนำโดยความคิดเห็น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!'))

ขยาย namespaces ทั่วโลกได้รับการคุ้มครองเพิ่มเติมได้ที่ GitBook


เหตุใดจึงจำเป็นต้องมีการประกาศทั่วโลก จะเกิดอะไรขึ้นถ้าไม่มี?
Jason Kuhrt

ใช้งานได้กับอินเทอร์เฟซ แต่ในกรณีที่ใครก็ตามต้องผสานประเภทโปรดทราบว่าประเภทเป็น "ปิด" และไม่สามารถผสานได้: github.com/Microsoft/TypeScript/issues/…
Peter W

คุณ @basarat ฉันเป็นหนี้คุณเบียร์
marcellsimon

ฉันยังต้องเพิ่ม tsconfig.json ของฉัน: {"compilerOptions": {"typeRoots": ["./src/typings/", "./node_modules/@types"]}, "files": ["./ src / typings / express / index.d.ts "]}
marcellsimon

วิธีแก้ปัญหาข้างต้นไม่ได้ผล .. แต่อันนี้ได้ผลในการรันครั้งแรก .. ขอบคุณมาก .. !!
Ritesh

56

สำหรับ Express เวอร์ชันใหม่ ๆ คุณต้องเพิ่มexpress-serve-static-coreโมดูล

สิ่งนี้จำเป็นเพราะตอนนี้วัตถุ Express มาจากที่นั่น: https://github.com/DefininiteTyped/DefininiteTyped/blob/8fb0e959c2c7529b5fa4793a44b41b797ae671b9/types/express/index.d.ts#L19

โดยทั่วไปให้ใช้สิ่งต่อไปนี้:

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

1
สิ่งนี้ใช้ได้ผลสำหรับฉันในขณะที่การขยาย'express'โมดูลแบบธรรมดาไม่ได้ ขอบคุณ!
Ben Kreeger

4
กำลังดิ้นรนกับสิ่งนี้เพื่อให้มันใช้งานได้ฉันต้องนำเข้าโมดูลด้วย:import {Express} from "express-serve-static-core";
andre_b

1
@andre_b ขอบคุณสำหรับคำแนะนำ ฉันคิดว่าคำสั่งนำเข้าเปลี่ยนไฟล์ให้เป็นโมดูลและนี่คือส่วนที่จำเป็น ฉันเปลี่ยนไปใช้export {}ที่ใช้งานได้เช่นกัน
Danyal Aytekin

2
ตรวจสอบให้แน่ใจไฟล์โค้ดนี้ไปในเป็นไม่ได้เรียกว่าexpress.d.tsมิฉะนั้นคอมไพเลอร์จะพยายามที่จะผสานนี้เข้า typings ด่วนส่งผลให้เกิดข้อผิดพลาด
Tom Spencer

3
ตรวจสอบให้แน่ใจว่าประเภทของคุณต้องอยู่ใน typeRoots ก่อน! types / express / index.d.ts และ tsconfig => "typeRoots": ["./src/types", "./node_modules/@types"]
ยา

31

คำตอบที่ยอมรับ (เช่นเดียวกับคนอื่น ๆ ) ไม่ได้ผลสำหรับฉัน แต่

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

เคยทำ. หวังว่าจะช่วยใครสักคน


2
วิธีการที่คล้ายกันนี้ได้อธิบายไว้ในเอกสาร tsใต้ "การเพิ่มโมดูล" จะดีมากถ้าคุณไม่ต้องการใช้*.d.tsไฟล์และเก็บประเภทของคุณไว้ใน*.tsไฟล์ปกติ
im.pankratov

3
นี่เป็นสิ่งเดียวที่ใช้ได้ผลสำหรับฉันเช่นกันคำตอบอื่น ๆ ทั้งหมดดูเหมือนจะต้องอยู่ในไฟล์. d.ts
รัฐสภา

สิ่งนี้ใช้ได้กับฉันเช่นกันโดยที่ฉันใส่custom-declarations.d.tsไฟล์ของฉันในรูทโปรเจ็กต์ของ TypeScript
focorner

ฉันขยายประเภทต้นฉบับเพื่อรักษาไว้: import { Request as IRequest } from 'express/index';และinterface Request extends IRequest. ต้องเพิ่ม typeRoot
Ben Creasy

17

หลังจากลอง 8 หรือมากกว่านั้นคำตอบและไม่ประสบความสำเร็จ ในที่สุดผมก็มีการจัดการที่จะได้รับมันทำงานร่วมกับjd291 's ความคิดเห็นที่ชี้ไปยัง3mards Repo

สร้างไฟล์ในฐานที่เรียกว่า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 = '';
}

แก้ไข : TypeScript เวอร์ชันล่าสุดบ่นเกี่ยวกับเรื่องนี้ แต่ฉันต้องทำ:

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

1
ซึ่งจะใช้งานได้ แต่ค่อนข้างละเอียดถ้าคุณมีฟังก์ชันมิดเดิลแวร์ 100s amirite
Alexander Mills

1
@ user2473015 ใช่ typescript รุ่นล่าสุดทำลายสิ่งนี้ ดูคำตอบที่อัปเดตของฉัน
Tom Mettam

8

ใน TypeScript อินเทอร์เฟซถูกเปิดสิ้นสุด นั่นหมายความว่าคุณสามารถเพิ่มคุณสมบัติให้กับพวกเขาได้จากทุกที่เพียงแค่กำหนดคุณสมบัติใหม่

เมื่อพิจารณาว่าคุณกำลังใช้ไฟล์express.d.tsนี้คุณควรกำหนดอินเทอร์เฟซคำขอใหม่เพื่อเพิ่มฟิลด์พิเศษได้

interface Request {
  property: string;
}

จากนั้นในฟังก์ชันมิดเดิลแวร์ของคุณพารามิเตอร์reqควรมีคุณสมบัตินี้เช่นกัน คุณควรจะสามารถใช้งานได้โดยไม่มีการเปลี่ยนแปลงรหัสของคุณ


1
คุณ "แบ่งปัน" ข้อมูลนั้นตลอดทั้งรหัสของคุณอย่างไร? ถ้าฉันกำหนดคุณสมบัติในการร้องขอพูดRequest.user = {};ในapp.tsวิธีการที่ไม่userController.tsทราบเกี่ยวกับมันได้หรือไม่
Nepoxx

2
@Nepoxx หากคุณกำหนดอินเทอร์เฟซใหม่คอมไพเลอร์จะผสานคุณสมบัติและทำให้มองเห็นได้ทุกที่นั่นคือเหตุผล ตามหลักการแล้วคุณจะกำหนดนิยามใหม่ในไฟล์. d.ts :)
toskv

ดูเหมือนว่าจะใช้งานได้ แต่ถ้าฉันใช้ประเภทexpress.Handler(แทนที่จะระบุด้วยตนเอง(req: express.Request, res: express.Response, next: express.NextFunction) => any)) ดูเหมือนว่าจะไม่ได้อ้างถึงเช่นเดียวRequestกับที่บ่นว่าไม่มีทรัพย์สินของฉัน
Nepoxx

ฉันจะไม่คาดหวังว่ามันจะเป็นเช่นนั้นเว้นแต่เป็นการด่วนตัวจัดการขยายอินเทอร์เฟซคำขอ ทำมัน?
toskv

2
ฉันสามารถทำให้การทำงานว่าถ้าผมใช้แต่ไม่ถ้าผมใช้declare module "express" declare namespace Expressฉันอยากจะใช้ไวยากรณ์ของเนมสเปซ แต่มันไม่ได้ผลสำหรับฉัน
WillyC

5

แม้ว่านี่จะเป็นคำถามที่เก่ามาก แต่ฉันก็พบกับปัญหานี้เมื่อไม่นานมานี้คำตอบที่ยอมรับใช้งานได้ดี แต่ฉันจำเป็นต้องเพิ่มอินเทอร์เฟซที่กำหนดเองRequest- อินเทอร์เฟซที่ฉันใช้ในรหัสของฉันและมันใช้งานได้ไม่ดีกับสิ่งที่ยอมรับ ตอบ. ฉันลองสิ่งนี้ตามเหตุผล:

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

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

แต่ไม่ได้ผลเนื่องจาก typescript ถือว่า.d.tsไฟล์เป็นการนำเข้าส่วนกลางและเมื่อมีการนำเข้าในไฟล์เหล่านั้นจะถือว่าเป็นโมดูลปกติ นั่นคือเหตุผลที่โค้ดด้านบนใช้ไม่ได้กับการตั้งค่าแบบมาตรฐาน

นี่คือสิ่งที่ฉันทำ

// typings/common.d.ts

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

export interface ITenant {
    ...
}

สิ่งนี้ใช้ได้กับไฟล์หลักของฉัน แต่ไม่ได้อยู่ในไฟล์การกำหนดเส้นทางหรือตัวควบคุมของฉันฉันไม่ได้รับขุย แต่เมื่อฉันพยายามรวบรวมกลับระบุว่า "คุณสมบัติ 'ผู้ใช้' ไม่มีอยู่ในประเภท 'คำขอ' (ฉันใช้ผู้ใช้แทนผู้เช่า) แต่ถ้าฉันเพิ่ม // @ ts - ละเว้นไว้ข้างบนมันก็ใช้ได้ (แม้ว่าจะเป็นวิธีที่โง่ ๆ ในการแก้ไขแน่นอนคุณมีความคิดว่าทำไมจึงไม่เป็นเช่นนั้น ทำงานกับไฟล์อื่น ๆ ของฉันหรือไม่
Logan

นั่นเป็นสิ่งที่แปลกมาก @Logan คุณสามารถแบ่งปันของคุณ.d.ts, tsconfig.jsonและตัวอย่างการใช้งาน? นอกจากนี้คุณใช้ typescript เวอร์ชันใดเนื่องจากการนำเข้านี้ในโมดูลส่วนกลางได้รับการสนับสนุนโดยเริ่มจาก TS 2.9 เท่านั้น ที่สามารถช่วยให้ดีขึ้น
16kb

ฉันอัปโหลดข้อมูลที่นี่pastebin.com/0npmR1Zrฉันไม่แน่ใจว่าทำไมการไฮไลต์จึงยุ่งเหยิงแม้ว่านี่มาจากไฟล์หลักprnt.sc/n6xsyl นี่มาจากไฟล์อื่นprnt.sc/n6xtp0 อย่างชัดเจนบางส่วนของ มันเข้าใจว่าเกิดอะไรขึ้น แต่คอมไพเลอร์ไม่เข้าใจ ฉันใช้ typescript เวอร์ชัน 3.2.2
Logan

1
น่าแปลกที่ ... "include": [ "src/**/*" ] ...เหมาะกับฉัน แต่"include": ["./src/", "./src/Types/*.d.ts"],ไม่ได้ผล ฉันยังไม่ได้ไปทำความเข้าใจเรื่องนี้เลย
16kb

การนำเข้าอินเทอร์เฟซโดยใช้การนำเข้าแบบไดนามิกใช้ได้ผลสำหรับฉัน ขอบคุณ
Roman 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();
});

ตอนนี้เรายังสามารถเพิ่มคุณสมบัติเพิ่มเติมที่เราต้องการให้กับวัตถุนี้ได้


3

คำตอบเหล่านี้ดูเหมือนจะผิดหรือล้าสมัยไม่ทางใดก็ทางหนึ่ง

สิ่งนี้ใช้ได้ผลสำหรับฉันในเดือนพฤษภาคม 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" ]

ไชโย


ทำงานร่วมกับ Webpack + Docker นำเข้า * สามารถแทนที่ด้วยการส่งออก {};
Dooomel

2

หากคุณกำลังมองหาโซลูชันที่ใช้ได้กับ express4 นี่คือ:

@ types / express / 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


1

ทางออกหนึ่งที่เป็นไปได้คือการใช้ "double casting to any"

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


@akshay ในกรณีนี้ใช่เพราะMyRequestขยายไฟล์http.IncomingMessage. ไม่เป็นเช่นนั้นการหล่อสองครั้งผ่านanyจะเป็นทางเลือกเดียว
Bruno Grieder

ขอแนะนำให้คุณแคสต์เป็น Unknown แทนสิ่งใด ๆ
dev

0

คำตอบนี้จะเป็นประโยชน์ต่อผู้ที่ใช้แพ็คเกจ npm ts-nodeคำตอบนี้จะเป็นประโยชน์ต่อผู้ที่พึ่งพาแพคเกจ

ฉันยังดิ้นรนกับความกังวลเดียวกันกับการขอขยายเวลาวัตถุฉันติดตามคำตอบมากมายใน stack-overflow และจบลงด้วยการทำตามกลยุทธ์ที่กล่าวถึงด้านล่าง

ฉันประกาศการพิมพ์เพิ่มเติมสำหรับExpressในไดเร็กทอรีต่อไปนี้${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ไม่สามารถค้นหาข้อกำหนดประเภทเพิ่มเติมสำหรับการร้องขอวัตถุที่

ในที่สุดหลังจากใช้เวลาหลายชั่วโมงเนื่องจากฉันรู้ว่า VS Code ไม่ได้บ่นและสามารถค้นหาคำจำกัดความการพิมพ์ได้ซึ่งหมายความว่ามีบางอย่างผิดปกติ 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 เมื่อพยายามขยายคำขอของ ExpressJS ฉันต้องพยายามมากกว่าหนึ่งโหลก่อนที่จะใช้งานได้:

  • พลิกลำดับของสิ่งที่ทุกคนแนะนำใน "typeRoots" ของ tsconfig.json ของคุณ (และอย่าลืมวางเส้นทาง src หากคุณมีการตั้งค่า rootDir ใน tsconfig เช่น "./src") ตัวอย่าง:
"typeRoots": [
      "./node_modules/@types",
      "./your-custom-types-dir"
]
  • ตัวอย่างส่วนขยายที่กำหนดเอง ("./your-custom-types-dir/express/index.d.ts") ฉันต้องใช้การนำเข้าแบบอินไลน์และการเอ็กซ์พอร์ตเริ่มต้นเพื่อใช้คลาสเป็นประเภทในประสบการณ์ของฉันเพื่อให้แสดงด้วย:
declare global {
  namespace Express {
    interface Request {
      customBasicProperty: string,
      customClassProperty: import("../path/to/CustomClass").default;
    }
  }
}
  • อัปเดตไฟล์ nodemon.json ของคุณเพื่อเพิ่มคำสั่ง "--files" ไปยัง ts-node ตัวอย่าง:
{
  "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. ภายในไดเร็กทอรี types ของคุณให้เพิ่มไดเร็กทอรีใหม่และตั้งชื่อเป็นแพ็กเกจที่คุณต้องการขยายหรือสร้างชนิด ในกรณีนี้คุณจะสร้างไดเร็กทอรีที่มีชื่อ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.