在 Typescript 中导入 CouchDB Nano 6.4 类型

Import CouchDB Nano 6.4 Typings in Typescript

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

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

我找到 this question 以获得正确的 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 intellisense screenshot

根据 comment-header,打字适用于 couchdb-nano(没有其他项目也称为 nano),也适用于此处使用的 6.4 版。

那么我做错了什么?

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

import Nano, { ServerScope } from "nano";

const nano = Nano("http://localhost:5984") as ServerScope;
const alice = nano.db.use("alice");

发现此问题是由类型定义中的不明确 return 值引起的:

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

nano 函数可以有 nano.ServerScopenano.DocumentScope<any> 作为 return 值。通过做一些逆向工程,我了解到 ServerScope 对我来说是正确的 class。它提供文档中提供的 db 等属性。

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

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

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

nanoInstance.db.create("test123");

有什么区别?

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

我目前正在将 nano 与 typescript 一起使用,intellisense 似乎工作正常。我是这样设置的。

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"
}