0

私は、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);
4

1 に答える 1