如何使用导入而不是require来创建快速应用程序

时间:2019-03-06 18:21:55

标签: typescript express

这是require的工作方式。相反,我们希望它使用import

import { Request, Response, Application } from 'express';

// TODO Figure out how NOT to use require here.
const express = require('express');
var app: Application = express();

app.get('/', function (req: Request, res: Response) {
  res.send('Hello World')
});

app.listen(3000);

我们尝试过的

我们的tsconfig.json具有"esModuleInterop": true

尝试#1

import express from 'express';

出现此错误:

  

“ node_modules / @ types / express / index”'没有默认的export.ts

尝试#2

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

给出了另一个错误:

  

无法调用类型缺少调用签名的表达式。类型'typeof e'没有兼容的呼叫签名.ts(2349)   index.ts(1,1):类型源自此导入。不能调用或构造名称空间样式的导入,并且将在运行时导致失败。考虑在此处使用默认导入或导入要求。

2 个答案:

答案 0 :(得分:2)

TypeScript具有special import syntax来处理整体导出函数或某些其他自定义对象的模块(不是默认导出):

import { Request, Response, Application } from 'express';
import express = require('express');

var app: Application = express();

app.get('/', function (req: Request, res: Response) {
  res.send('Hello World')
});

app.listen(3000);

或者,您可以使用TypeScript编译器选项来更改导入的模块,以使它们具有默认导出:

// tsconfig.json
{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,     /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
    "esModuleInterop": true,                  /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
  }
}

并使用此默认导入进行导入:

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

答案 1 :(得分:0)

我的也出现了同样的错误,可能是因为使用的版本,我决定::

const express = require('express');
const app = express();
const PORT = 3000;

e no package.json: "node index.js"