С выпуском поддержки TypScript 1.7 и async/await я подумал, что было бы неплохо попробовать Createcript с koa @ 2.Внешние модули в машинописном файле при настройке ES6
У меня есть очень простой настройки и вид уже работает:
// app.ts
/// <reference path="../typings/koa.d.ts" />
import Koa from 'koa';
const app = new Koa();
Поскольку КоА не написано в машинописном, я должен был сделать небольшой файл определения:
// koa.d.ts
declare module 'koa' {
interface Context {
// ctx
}
export default class Koa {
constructor();
listen(port: number): any;
use(Function: (ctx: Context, next:() => Promise<void>) => void): Function;
use(Function: (ctx: Context) => void): Function;
}
}
Это все хорошо работает в среде IDE (ошибок нет, также работает автозаполнение). Однако, когда я компилирую (цель => ES6) его Javascript, скомпилированный файл не может быть выполнена:
// generated app.js
var koa_1 = require('koa');
const app = new koa_1.default();
Когда я пытаюсь запустить его, я получаю следующее сообщение об ошибке:
/Users/andreas/IdeaProjects/project/dist/app.js:16
const app = new koa_1.default();
^
TypeError: koa_1.default is not a function
at Object.<anonymous> (/Users/andreas/IdeaProjects/project/dist/app.js:16:13)
at Module._compile (module.js:425:26)
at Object.Module._extensions..js (module.js:432:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:313:12)
at Function.Module.runMain (module.js:457:10)
at startup (node.js:138:18)
at node.js:974:3
Это не работает, потому что koa_1.default() не является функцией, она должна быть просто koa_1(). (Я также не уверен, почему он переименовывает такую переменную). Если я сделаю это простое изменение в сгенерированном app.js, все будет работать.
Я читал много статей, связанных с машинописными и внешними модулями, но я все еще, кажется, что-то пропустил. Я нашел этот пример на одном из сайтов: source
// foo.js
export var bar = 'bar'
export default 'foo';
// app.js
import foo from './foo';
// foo => 'foo'
import * as fooModule from './foo';
// fooModule => { bar: 'bar', default: 'foo' }
import { default as defaultFoo } from './foo';
// defaultFoo => 'foo'
Этот вид объясняет, почему это добавление .DEFAULT, но из моего понимания он делает это в неправильном положении. (Это не требуется, когда я import Koa from 'koa';
, но когда я import * as Koa from 'koa';
Когда я изменить оператор импорта в моем app.ts к import * as Koa from 'koa';
сгенерированному app.js работу, но Машинопись компилятор и IDE дают мне следующие сообщения об ошибках .
src/app.ts(13,13): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
src/app.ts(23,16): error TS7006: Parameter 'ctx' implicitly has an 'any' type.
src/app.ts(23,21): error TS7006: Parameter 'next' implicitly has an 'any' type.
src/app.ts(32,9): error TS7006: Parameter 'ctx' implicitly has an 'any' type.
Так в настоящее время, я могу выбрать, если моя среда разработки работает или если генерируемое Javascript работает, но не оба.
Что такое лучший способ справиться с этой проблемой?
Я думаю, что проще всего было бы изменить файл определения koa.d.ts, чтобы он соответствовал import * as Koa from 'koa';
. Однако мне этого не удалось.
Благодарим за помощь!
Проверьте, есть ли у вас проблема, обсуждаемая здесь (http://stackoverflow.com/q/32987273/154066), где один инструмент обертывает входящие библиотеки по умолчанию, а другой - нет. Затем просмотрите несколько библиотек на DefinitelyTyped, чтобы увидеть, как они пишут defs - те, которые я видел, не используют экспорт по умолчанию, обычно предпочитают вместо этого 'export ='. –