node.js - Πώς να χειριστείτε προαιρετικές παραμέτρους διαδρομής του ExpressJS με TypeScript;
Έχω τον ακόλουθο κώδικα:
index.ts
import express from "express";
import { Uuid } from "./Uuid";
import { UuidGen } from "./Uuid_gen";
const app = express();
const port = process.env.port || 3000;
app.get("/Uuidgen/1/:operatingAgency/:locId?", (request, result) =>
result.send(UuidGen.generateType1Uuid(request.params.operatingAgency, request.params.locId).toString())
);
app.listen(port, () => console.log(`UUID Generator listening on port ${port}`));
Τώρα, όταν το αρχείο αποθηκεύεται με επέκταση .ts, ο μεταγλωττιστής TypeScript παραπονιέται:
Τώρα, όταν εφαρμόζεται το 'Γρήγορο Σταθεροποίηση', αυτός είναι ο προκύπτων κώδικας:
app.get("/Uuidgen/1/:operatingAgency/:locId?", (request, result) =>
result.send(UuidGen.generateType1Uuid(request.params.operatingAgency, request.params["locId?"]).toString())
Αυτό μεταγλωττίζεται χωρίς πρόβλημα, αλλά η παράμετρος locId δεν περνά ποτέ στη συνάρτηση callback και είναι άδεια. Τι μπορώ να κάνω; Μία προσωρινή λύση είναι να αλλάξω την επέκταση σε .js και να διασφαλίσω ότι το "checkJs": false στο tsconfig.json, αλλά ιδανικά θα ήθελα ολόκληρο το έργο μου σε TypeScript.
Έχω καταχωρημένο το @types/express κάτω από τα devDependencies στο package.json.
Απάντηση #1
Η βιβλιοθήκη express έχει το interface Request με γενικό τύπο για Params, Query, Body. Αυτό θα λειτουργούσε για αυτή την περίπτωση. Για παράδειγμα:
import express, { Request } from 'express';
const app = express();
const port = process.env.port || 3000;
interface RequestParams {
locId?: number;
operatingAgency: string;
}
app.get('/Uuidgen/1/:operatingAgency/:locId?', (request: Request<RequestParams>, result) =>
result.send(UuidGen.generateType1Uuid(request.params.operatingAgency, request.params.locId).toString()),
);
app.listen(port, () => console.log(`UUID Generator listening on port ${port}`));
