2015-12-10 3 views
3

С выпуском поддержки 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';. Однако мне этого не удалось.

Благодарим за помощь!

+0

Проверьте, есть ли у вас проблема, обсуждаемая здесь (http://stackoverflow.com/q/32987273/154066), где один инструмент обертывает входящие библиотеки по умолчанию, а другой - нет. Затем просмотрите несколько библиотек на DefinitelyTyped, чтобы увидеть, как они пишут defs - те, которые я видел, не используют экспорт по умолчанию, обычно предпочитают вместо этого 'export ='. –

ответ

0

Изменить это:

export default class Koa { 

к этому

class Koa { 
// ... 
namespace Koa { // add all your export interface inside 
// ... 
export = Koa; 

Keep, используя синтаксис import * as Koa.