26

ノード プロジェクトで 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

私が理解している限り、「デフォルト」のブラケットなしでコードを取得する必要があり、正常に機能していたはずです-ブラケットを削除しようとしたところ、機能しました。

ここで何が欠けていますか?

4

5 に答える 5

36

最も安全な解決策は次のとおりです。

import express = require('express');

これは次のように変換されます。

var express = require('express');

import require 宣言の公式ドキュメントは、こちらにあります

ここの最後の段落から判断すると、TypeScriptは「デフォルト」という名前のエクスポートが上記のコードとして機能することを期待していると思います。


補足: TypeScript の最新バージョン (執筆時点では 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 の例は、こちらにありますcommonjs(この例のよう)のモジュールをターゲットにすると、これも にトランスパイルされvar express = require('express');ます。


少なくとも TypeScript 2.7 があり、CommonJS をターゲットにしている場合は、esModuleInteropも使用できます。

リンクから:

ユーザーに Babel または Webpack と同じランタイム動作を提供するために、TypeScript は、レガシー モジュール形式に出力するときに新しい --esModuleInterop フラグを提供します。

新しい --esModuleInterop フラグの下で、これらの呼び出し可能な CommonJS モジュールは、次のようにデフォルトのインポートとしてインポートする必要があります。

import express from "express";

let app = express();

Node.js ユーザーは、呼び出し可能/構築可能なモジュールをエクスポートする Express.js などのライブラリの CommonJS のモジュール ターゲットでこのフラグを活用することを強くお勧めします。

于 2015-12-29T23:44:13.990 に答える
7

Express.js などの非 ES6 モジュールのデフォルトのエクスポートを使用しようとしている場合は、従来のインポート構文を使用する必要がありますimport express = require('express')

module.exportsES6 モジュールには、Node.js モジュールの やreturnAMD モジュールの のようなデフォルト値のエクスポートはありません。ES6 モジュールのデフォルトのエクスポートは単なるdefault鍵です。これが、試みているように ES6 のデフォルトを使用すると、TypeScript がプロパティimportへのアクセスを含む JavaScript を生成する理由です。default

これに関する詳細は、commonjs / amd モジュールをインポートするための新しい es6 構文、つまり `import foo = require('foo')`で入手できます。

于 2015-12-30T04:17:21.160 に答える