如何使用Typescript定义knex迁移

6

我希望使用 TypeScript (v1.5) 定义一个 knex 迁移,但无法以类型安全的方式定义 up/down 回调函数:

以下是我认为可能有效的代码(但显然不起作用):

/// <reference path="../../typings/knex/knex.d.ts" />
/// <reference path="../../typings/bluebird/bluebird.d.ts" />

exports.up = function(k : knex.Knex, Promise : Promise<any>) {
};

exports.down = function(k: knex.Knex, Promise : Promise<any>) {
};

TSC输出错误信息为error TS2304: 找不到名称 'knex'。

我尝试了一些变化,包括添加import knex = require("knex");,但没有成功。

供您参考,knex.d.ts文件声明了一个模块,如下所示:

declare module "knex" {
// ... 
  interface Knex extends QueryInterface { }
  interface Knex {
// ... 
  }
}

有什么想法吗?或者我在尝试不可能的事情吗?
1个回答

5
问题是由于knex.d.ts文件没有导出Knex接口本身,而是只导出一个创建“Knex”实例的函数所致。
解决方案:
更改knex.d.ts文件以导出Knex本身。为此,请将文件末尾的export = _语句替换为以下代码块:
function Knex( config : Config ) : Knex;
export = Knex;

工作迁移看起来像这样:
/// <reference path="../../typings/knex/knex.d.ts" />
/// <reference path="../../typings/bluebird/bluebird.d.ts" />
import Knex = require("knex");

exports.up = function(knex : Knex, Promise : Promise<any>) {
};

exports.down = function(knex: Knex, Promise : Promise<any>) {
};

这种方法非常有效。我将创建一个拉取请求,以便将更新的knex.d.ts放入DefinitelyTyped存储库中。


3
由于这个提交:https://github.com/borisyankov/DefinitelyTyped/commit/efaab812e1f09ed92825ca0a5bd08c6cb5422104,现在不再需要这个了。 - tanguy_k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接