javascript - Typescript-kod fungerar inte med CommonJS-stilens require-uttryck


Jag är ny inom Typescript, Node samt Express. Jag satte upp mitt projekt exakt som det beskrivs här: https://linux-console.net/community/tutorials/setting-up-a-node-project-with-typescript

Detta är koden som jag försöker köra som jag fick från den länken:

import express from 'express';

const app = express();
const port = 3000;
app.get('/', (req, res) => {
  res.send('The sedulous hyena ate the antelope!');
});
app.listen(port, err => {
  if (err) {
    return console.error(err);
  }
  return console.log(`server is listening on ${port}`);
});

När jag försöker köra den här koden med npm start får jag detta fel: No overload matches this call. The last overload gave the following error. Argument of type '(err: any) => void' is not assignable to parameter of type '() => void'.ts(2769) Jag kollade .d.ts-filen och såg att callbacken inte tar några argument. Någon annan stötte på samma problem med denna kod här: express typescript err throw 'any' warning

Jag läste sedan kommentarerna på det ursprungliga inlägget där jag fick detta inlägg ifrån och någon nämnde att koden fungerar om de ändrar den första raden från import express from 'express'; till var express=require('express'); Varför händer detta? Jag var också tvungen att uttryckligen ange typerna för req, res och err som any för att få det att fungera. Detta är den slutliga koden som fungerar:

var express = require('express');

const app = express();
const port = 3000;
app.get('/', (req: any, res: any) => {
  res.send('The sedulous hyena ate the antelope!');
});
app.listen(port, (err: any) => {
  if (err) {
    return console.error(err);
  }
  return console.log(`server is listening on ${port}`);
});

Svar #1

När du får felet No overload matches this call. betyder det att du definierar parametrar som inte finns på den typen.

I ditt fall har du err-parametern på listen-callbacken vilket inte borde finnas där (se http://expressjs.com/en/api.html under app.listen)

För att åtgärda ts-felet, ta bara bort err och relaterad kod nedan.

När det gäller dina importer skulle jag föreslå att behålla dem med den nyare syntaxen istället för den gamla require (som nu borde fungera utan problem).

Sist men inte minst, försök alltid undvika att sätta dina typer som any, eftersom det är som att ha en brandvarnare utan batterier. De typer du letar efter är tydligt inbyggda och du kan definiera dem som sådana:

app.get('/', (req: express.Request, res: express.Response) => {
  res.send('The sedulous hyena ate the antelope!');
});