2016-02-14 2 views
0

Я пытаюсь создать разреженный файл объявления типа для feathersjs, поэтому я могу лучше использовать его в TypScript.Импорт импортных файлов из ES2015 export: как указать файл объявления типа

Перья написаны на 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); 

Так далекие, машинописные компиляции без ошибок, я получаю все справки по проверке типов в среде IDE (atom-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 * as feathers from "feathers"; 

Тогда проверка типа не удается, и компилятор выдает ошибки, но это не производит работы ES5:

var feathers = require("feathers"); 
var app = feathers(); 
app.use('/', feathers.static(__dirname)).listen(3001); 

ошибки машинопись компилятора:

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); 

ответ

0

Вы пишете типизации для модуля CommonJS поэтому не используйте export default, вместо того, чтобы сделать это:

declare module "feathers" { 
    // ... 

    var createApplication: Feathers; 
    export = createApplication; 
} 

А затем импортировать его, как это:

import feathers = require('feathers'); 
// OR 
import * as feathers from 'feathers'; 

const app = feathers(); 
app.use('/', feathers.static(__dirname)).listen(3001); 
+0

Понял , Спасибо. Я нашел различие в спецификации Typcript ([11.3.5] (https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#1135-export-assignments)): «Назначение экспорта обозначает член модуля как объект, который будет экспортироваться вместо самого модуля ». по сравнению с [11.3.4.2] (https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#11342-export-default-declarations), в котором говорится: «Экспортировать объявления по умолчанию предоставляют короткий синтаксис для экспорт объекта с именем 'default'. – drewlio

+0

Принятый ответ на http://stackoverflow.com/questions/29596714/new-es6-syntax-for-importing-commonjs-amd-modules-i-e-import-foo-require также стоит прочитать. –