node.js - Comasarea declarațiilor în Typescript: suprascriere?


Există o modalitate de a „suprascrie” atunci când se face fuziunea declarațiilor, de exemplu:

app.ts (express + nodejs):

import * as express from 'express';
var app = express();

app.use(function(req, res, next) {
  console.log(req.headers.accept);
});

Acest lucru eșuează cu eroare:

error TS2339: Property 'accept' does not exist on type '{ [key: string]: string; }'.

Pentru că în express.d.ts antetele sunt declarate astfel:

headers: { [key: string]: string; };

Deci, ceea ce am încercat să fac, este să creez o definiție a „accepta” :

declare module Express {
  export interface Headers {
    accept: String
  }
  export interface Request {
    headers: Headers
  }
}

Dar asta nu funcționează nici (pot doar să adaug membri noi, nu să îi suprascriu, nu-i așa?):

    error TS2430: Interface 'e.Request' incorrectly extends interface 'Express.Request'.
  Types of property 'headers' are incompatible.
    Type '{ [key: string]: string; }' is not assignable to type 'Headers'.
      Property 'accept' is missing in type '{ [key: string]: string; }'.

Deci singura modalitate de a depăși acest lucru este să schimbi notația în:

req.headers.accept -> req.headers['accept']

Sau pot cumva să „redeclari” proprietatea headers?

Răspuns #1

În Express, poți folosi metoda accepts (documentația accepts):

if (req.accepts('json')) { //...

Sau dacă vrei să le ai pe toate, sunt disponibile ca:

console.log(req.accepted);

Pentru a obține alte antete, folosiți metoda get (documentația metodei get)

req.get('Content-Type');

Toate acestea sunt incluse în definiția tipului pentru Express pe Definitely Typed.