如何使用 Typescript 定义 knex 迁移

str*_*her 5 typescript knex.js

我想使用 TypeScript (v1.5) 定义 knex 迁移,但无法以类型安全的方式定义向上/向下回调:

这就是我认为可能有效的方法(但显然无效):

/// <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>) {
};
Run Code Online (Sandbox Code Playgroud)

TSC 输出是 error TS2304: Cannot find name 'knex'.

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

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

declare module "knex" {
// ... 
  interface Knex extends QueryInterface { }
  interface Knex {
// ... 
  }
}
Run Code Online (Sandbox Code Playgroud)

任何的想法?还是我在这里尝试了一些不可能的事情?

str*_*her 5

该问题是由 knex.d.ts 文件引起的,该文件不导出 Knex 接口本身,而是仅导出用于创建“Knex”实例的函数。

解决方案:

更改knex.d.ts文件以导出 Knex 本身。为此,请将export = _文件末尾的语句替换为以下代码块:

function Knex( config : Config ) : Knex;
export = Knex;
Run Code Online (Sandbox Code Playgroud)

工作迁移如下所示:

/// <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>) {
};
Run Code Online (Sandbox Code Playgroud)

这样效果很好。我将创建一个拉取请求以将更新内容添加knex.d.ts到 DefinitlyTyped 存储库中。

  • 由于此提交,不再需要这样做:https://github.com/borisyankov/DefinitelyTyped/commit/efaab812e1f09ed92825ca0a5bd08c6cb5422104 (3认同)