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

时间:2015-12-29 22:45:39

标签: javascript node.js typescript es6-module-loader

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

这是我的index.ts文件:

import express from 'express';

const app = express();

我正在跑步:

tsc --module commonsjs -d index.ts

我的输出是index.js:

var express_1 = require('express');
var app = express_1["default"]();

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

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

TypeError: express_1.default is not a function

据我了解,我应该在没有“默认”括号的情况下获得代码并且它可以正常工作 - 我尝试删除括号并且它有效。

我在这里缺少什么?

5 个答案:

答案 0 :(得分:18)

最安全的解决方案是:

import express = require('express');

这转化为:

var express = require('express');

可以找到导入需要声明的官方文档here

我相信打字稿需要一个名为"默认"从最后一段here判断,作为上面的代码。

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

index.ts(1,8): error TS1192: Module '"express"' has no default export.

附注2,可以找到使用import * as express from 'express';语法的Microsoft示例here。在定位commonjs模块时(在此示例中为they are),这也将转换为var express = require('express');

答案 1 :(得分:4)

如果您尝试使用Express等非ES6模块的默认导出,则需要使用旧版导入语法module.exports。在ES6模块中,没有默认值导出,如Node.js模块的return或AMD模块的default; ES6模块的默认导出只是import键。这就是为什么当您尝试使用ES6默认default时,TypeScript会生成具有ArrayList属性访问权限的JavaScript。

有关此内容的更多信息,请访问outlined here

答案 2 :(得分:1)

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

import express from "express"; 
// if above is not supported by your project environment then follow as below
import * as express from "express";

tsconfig.json

{
  "compilerOptions": {
    ...   
    "module": "commonjs"
    ...
  }
}

感谢@Josh Dando

答案 3 :(得分:0)

我通过将以下内容添加到tsconfig.json中来解决了这个问题:

{
  "compilerOptions": {
    ... 
    "module": "commonjs",
    "esModuleInterop": true,
    ...
  }
}

esModuleInterop 标志的描述如下:“发出__importStar和__importDefault帮助程序以实现运行时babel生态系统兼容性,并启用--allowSyntheticDefaultImports以实现类型系统兼容性。”

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

答案 4 :(得分:0)

另一个可能适合您的解决方案是这样做:

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

它应该以相同的方式工作。