随着 Typescript 1.7 和 async/await 支持的发布,我认为现在是尝试使用 koa@2 的 Typescript 的好时机。
我有一个非常简单的设置,它已经可以工作了:
// app.ts
/// <reference path="../typings/koa.d.ts" />
import Koa from 'koa';
const app = new Koa();
因为koa不是用Typescript写的,所以只好做了一个小定义文件:
// 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 中运行良好(没有错误,自动完成也可以)。但是,当我将 (target => 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 语句更改为import * as Koa from 'koa';
生成的 app.js 时有效,但 Typescript 编译器和 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 定义文件更改为 match import * as Koa from 'koa';
。但是,我没有做到这一点。
谢谢你的帮助!