如何使用 Typescript 定义 knex 迁移

How to define knex migrations using Typescript

我想使用 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: Cannot find name 'knex'.

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

供您参考,knex.d.ts 文件声明了这样一个模块:

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

有什么想法吗?还是我在这里尝试了一些不可能的事情?

问题是由 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 放入 DefinitlyTyped 存储库。