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.
