NodeJS + TypeScript:类型为脚本编译代码的语法不清楚

Shi*_*shi 11 javascript node.js typescript es6-module-loader

我正在尝试在我的节点项目中使用Typescript,但是遇到了一些问题.

这是我的index.ts文件:

import express from 'express';

const app = express();
Run Code Online (Sandbox Code Playgroud)

我在跑:

tsc --module commonsjs -d index.ts
Run Code Online (Sandbox Code Playgroud)

我的输出是index.js:

var express_1 = require('express');
var app = express_1["default"]();
Run Code Online (Sandbox Code Playgroud)

["default"]是从哪里来的?它使我的代码无法正常运行:

var app = express_1["default"]();
                              ^

TypeError: express_1.default is not a function
Run Code Online (Sandbox Code Playgroud)

据我所知,我应该得到没有"默认"括号的代码,它会工作正常 - 我尝试删除括号,它的工作原理.

我在这里错过了什么?

dvl*_*lsg 20

最安全的解决方案是:

import express = require('express');
Run Code Online (Sandbox Code Playgroud)

这转化为:

var express = require('express');
Run Code Online (Sandbox Code Playgroud)

可以在此处找到导入需要声明的官方文档.

我相信typescript期望一个名为"default"的导出作为上面的代码,从这里的最后一段来看.


旁注,看起来像打字稿的最新版本(撰写本文时为typescript@1.8.0-dev.20151229)将在编译尝试时发出警告,该尝试将尝试使用缺少的默认值:

index.ts(1,8): error TS1192: Module '"express"' has no default export.
Run Code Online (Sandbox Code Playgroud)

附注2,import * as express from 'express';可以在此处找到Microsoft使用语法的示例.当定位的模块commonjs(如它们是在该示例中),这也将transpile到var express = require('express');.

  • 考虑使用 esModuleInterop: true 编译器选项(在 tsconfig 上设置)。这允许您按照您的预期进行“从‘express’导入快递’” (2认同)

Lia*_*iam 6

我通过添加以下内容来解决此问题tsconfig.json

{
  "compilerOptions": {
    ... 
    "module": "commonjs",
    "esModuleInterop": true,
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

所述esModuleInterop标志被描述为:“的Emit __importStar和__importDefault助手用于运行时巴贝尔生态系统的相容性和使能类型系统兼容性--allowSyntheticDefaultImports”。

https://www.typescriptlang.org/docs/handbook/compiler-options.html

  • 这应该是公认的答案,因为它允许简单地使用“import express from 'express'” (3认同)

C S*_*ver 5

如果您尝试使用非ES6模块(如Express)的默认导出,则需要使用旧版import语法import express = require('express')。在ES6模块中,没有默认值导出,例如module.exportsNode.js模块或returnAMD模块。ES6模块的默认导出只是default关键。这就是为什么当您import尝试使用默认的ES6时,TypeScript生成具有对该default属性访问权限的JavaScript的原因。

有关此问题的更多信息,请参见用于导入commonjs / amd模块的新es6语法,即“ import foo = require('foo')”


Was*_*siF 5

如果您仍然想使用该import关键字,请像这样使用它:

import express from "express"; 
// If the above is not supported by your project environment then follow as below
import * as express from "express";
Run Code Online (Sandbox Code Playgroud)

在文件中tsconfig.json

{
  "compilerOptions": {
    ...   
    "module": "commonjs"
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

谢乔什·丹多