为什么这 2 个 NodeJS / Typescript 导入会给出不同的结果?

Why do these 2 NodeJS / Typescript imports give different results?

在一个NodeJS项目中,我安装了typescript 3.2、express 4.16和@types/express 4.16

我正在用 Typescript 编写我的应用程序,以便稍后转译。 @types/express 的文档说要以这种方式导入和使用:

import * as express from "express";
const app = express();

然而,当我这样做时,第二行会抛出一个错误,因为 express 不是一个函数(没有调用签名)。当我控制台日志 express 我得到一个带有 application 属性

的对象

另一方面,如果我以这种方式导入和使用:

import express = require('express');
const app = express();

然后一切正常,控制台日志记录 express 显示一个名为 createApplication 或类似名称的函数。该函数本身似乎与第一种方法具有相同的 application 属性。

有什么区别?

TypeScript@2.7 开始,支持以下导入默认模块的语法:

import b from "bar";

带有 * 的示例将导入模块的所有导出 as a module object 但你可能想要

import express from "express";
const app = express();