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}`));