私は、Fathersjs のスパース型宣言ファイルを作成しようとしているので、Typescript でより適切に使用できます。
Feathers は ES2015 で書かれており、ES5 を (Babel 経由で) 配布しています。ES5 のデフォルトのエクスポート:
function createApplication() {
var app = express();
Proto.mixin(Application, app);
app.init();
return app;
}
module.exports = createApplication;
私の型宣言ファイル (feathers.d.ts):
declare module "feathers" {
import * as express from "express";
import * as serveStatic from 'serve-static';
interface Feathers extends express.Express {
(func?: express.Express): Feathers;
setup(): Feathers;
static: typeof serveStatic;
}
var createApplication: Feathers;
export default createApplication;
}
私のアプリ(server.ts):
import feathers from "feathers";
const app = feathers();
app.use('/', feathers.static(__dirname)).listen(3001);
これまでのところ、typescript はエラーなしでコンパイルされます。IDE (atom-typescript) ですべての優れた型チェック ヘルプを利用できます。Typescript は次の ES5 にコンパイルされますが.default()
、デフォルトのエクスポートの結果として実行されません。(server.js):
var feathers_1 = require("feathers");
var app = feathers_1.default();
app.use('/', feathers_1.default.static(__dirname)).listen(3001);
import ステートメントを次のように変更した場合:
import * as feathers from "feathers";
その後、型チェックは失敗し、コンパイラはエラーを出力しますが、実行中の ES5 を生成します:
var feathers = require("feathers");
var app = feathers();
app.use('/', feathers.static(__dirname)).listen(3001);
typescript コンパイラ エラーは次のとおりです。
error TS2349: Cannot invoke an expression whose type lacks a call signature.
error TS2339: Property 'static' does not exist on type 'typeof "feathers"'.
質問:import
この場合、次のステートメントのうちどれを使用する必要がありますか? または、宣言ファイル (上記) の何が問題になっていますか?
// import feathers from "feathers"; // no errors, but emits .default object
// import * as feathers from "feathers"; // errors, but working ES5
// import feathers = require("feathers"); // errors, but working ES5
const app = feathers();
app.use('/', feathers.static(__dirname)).listen(3001);