Я пытаюсь создать разреженный файл объявления типа для 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);
Понял , Спасибо. Я нашел различие в спецификации 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
Принятый ответ на http://stackoverflow.com/questions/29596714/new-es6-syntax-for-importing-commonjs-amd-modules-i-e-import-foo-require также стоит прочитать. –