打字稿:找不到命名空间

时间:2019-05-28 11:24:24

标签: javascript node.js typescript

我有以下简单的NodeJS代码:

const express = require('express');

const server: express.Application = express();

我正在将Typescript添加到我的项目中,并且是新手,所以请原谅我。通过上面的代码,我得到以下问题/错误:

对于需求:

var require: NodeRequire (id: string) => any (+1 overload)
'require' call may be converted to an import.

用于快递。应用用法:

Cannot find namespace 'express'.

如果我将'require'切换为'import',则会修复名称空间错误,但不再是有效的Node代码,因此无法运行(引发有关导入意外令牌的新错误)。

用Typescript编写这样的Node代码以避免这些错误的正确方法是什么?

我的tsconfig.json看起来像这样:

{
  "compilerOptions": {
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "alwaysStrict": true,
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "jsx": "preserve",
    "lib": ["dom", "es2017"],
    "module": "esnext",
    "moduleResolution": "node",
    "noEmit": true,
    "noFallthroughCasesInSwitch": true,
    "noImplicitReturns": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "removeComments": true,
    "resolveJsonModule": true,
    "sourceMap": true,
    "strict": true,
    "target": "esnext",
  },
  "exclude": ["node_modules"],
}

2 个答案:

答案 0 :(得分:0)

也许您必须使用 import 而不是 require

import * as express from 'express';

答案 1 :(得分:0)

经过大量时间浪费后,事实证明这是由于tsconfig文件中的module设置所致:

"module": "commonjs"

这意味着Typescript将输出常见的js模块而不是ES6模块,这意味着该代码将作为NodeJS代码正确运行。因此,我能够更改require import,因为它可以编译。