0

我想在带有 Typescript 的 NodeJS 应用程序中使用 CouchDB 作为数据库后端。CouchDb-Nano用于此目的,因为它提供了所需的 Typings。所以我安装了两个包:

  "devDependencies": {
    "@types/nano": "^6.4.5"
  },
  "dependencies": {
    "nano": "^6.4.3"
  }

我为正确的 TS 导入语法找到了这个问题。它对我不起作用。通过玩耍,我发现了以下编译:

import Nano from "nano";
let nano = Nano("http://localhost:5984");

但是我在 VS 代码中的智能感知似乎完全不同。例如,文档说 nano 有一个名为的属性db,其中有几种用于选择数据库的方法:

var alice = nano.db.use('alice');

这段代码给了我一个错误,没有调用的属性db存在。Intellisense 仅将我显示auth, config, session为属性:

VS Code 智能感知截图

根据comment-header,打字是针对couchdb-nano(没有其他项目也称为nano)以及这里使用的6.4版。

那么我做错了什么?

4

3 回答 3

1

看起来您应该能够将 Nano 函数转换为 ServerScope 接口,然后智能感知应该在与您的 nano 对象交互时工作。

import Nano, { ServerScope } from "nano";

const nano = Nano("http://localhost:5984") as ServerScope;
const alice = nano.db.use("alice");
于 2018-04-18T15:11:07.010 回答
1

发现这个问题是由类型定义中的一个不明确的返回值引起的:

declare function nano(
  config: nano.Configuration | string
): nano.ServerScope | nano.DocumentScope<any>;

nano函数可以有nano.ServerScopenano.DocumentScope<any>作为返回值。通过做一些逆向工程,我了解到这ServerScope是适合我的课程。它提供了类似的属性db,这些属性出现在文档中。

所以我们需要在这里显式地强制转换:

let nanoInstance = <Nano.ServerScope>Nano("http://localhost:5984");

现在文档中的所有示例代码都像这样运行良好:

nanoInstance.db.create("test123");

有什么不同?

我对 nosql-databases 太陌生,无法准确解释差异。但我假设通过提供某种 url 参数,我们可以直接连接到单个文档,而不是整个数据库。当我知道更多时,我会尝试编辑这篇文章。目前,这与我无关。

于 2018-04-18T15:12:37.590 回答
1

我目前正在使用 nano 和 typescript,并且智能感知似乎工作正常。我是这样设置的。

import Nano from 'nano';

const instance: Nano.ServerScope = Nano('http://localhost:5984/');
const db: Nano.DocumentScope<{}> = instance.db.use('alice');

对于依赖项,我正在使用:

"dependencies": {
  "nano": "^7.0.0"
},
"devDependencies": {
  "@types/nano": "^6.4.6"
}
于 2018-08-24T09:46:30.983 回答