如何解决PouchDB的错误(?)TypeScript / DefinitelyTyped类型?

时间:2017-05-23 15:57:27

标签: typescript pouchdb typescript-typings definitelytyped

我正在寻找TypeScript和PouchDB type declarations的帮助。考虑这个TS代码:

import PouchDB = require('pouchdb')
import find = require('pouchdb-find')
PouchDB.plugin(find)

const data = new PouchDB("http://localhost:5984/data"),

export async function deleteLastRevForIds(dbname, ids) {
  const docsToDelete = await data.find({
    fields: ["_id", "_rev"],
    selector: { _id: { $in: ids } }
  })

  const deletePromise = docsToDelete.docs.map(doc => {
    return data.remove(doc) // <-- HERE TSC SHOUTS AT ME about `doc`
  })
  const deletion = await Promise.all(deletePromise)
  return deletion
}

在带注释的remove()电话中,tsc会发出此错误:

Argument of type 'IdMeta' is not assignable to parameter of type 'RemoveDocument'.
  Type 'IdMeta' is not assignable to type 'RevisionIdMeta'.
    Property '_rev' is missing in type 'IdMeta'.'

find()来电typed by the DefinitelyTyped typings之所以发生了什么? 返回{docs: PouchDB.Core.IdMeta[]}。顾名思义, PouchDB.Core.IdMeta[]表示{_id: string}的数组。

但这是假的! PouchDB.find()并不仅返回{_id: ...}个对象的列表, 它返回{_id: ..., _rev: ...}的列表(加上我明确要求这两个字段)。或者我错过了什么?

因此,在调用remove()函数时(由DT类型正确输入为 TS需要一个完全指定的_id + _rev RevisionIdMeta)这样的对象,TS正对我大声喊叫。

我试着向各个方向投掷这个东西,但是不能按照我的意愿弯曲它; tsc一直错误地说明我的对象中缺少_rev

  • 我有没有办法做这样一个&#34;深的&#34;投?
  • 如果没有,有没有办法尽可能在本地覆盖DT类型?
  • 我应该完全做其他事吗?

另外,我应该提议改变DT类型吗?

感谢。

2 个答案:

答案 0 :(得分:2)

  

有没有办法让我做这样一个&#34;深&#34;投?

您始终可以使用as any as Whatever重新投射内容。显然,如果你不能确定类型是正确的,这应该是最后的手段,因为断言周围没有任何安全性。例如123 as any as Window编译。

  

有没有办法尽可能在本地覆盖DT类型?

是的,请看Declaration Merging: Module Augmentation

  

我应该完全做其他事吗?

如果您确定类型定义错误,您可以随时修补它们并将PR提交给DefinitelyTyped。

答案 1 :(得分:1)

是的,Pouchdb-find定义是错误的。这样的事情会让你感动......

const data = new PouchDB("http://localhost:5984/data")

interface FixedFindResponse<Content extends PouchDB.Core.Encodable> {
  docs: PouchDB.Core.ExistingDocument<Content>[];
}
export async function deleteLastRevForIds(dbname: void, ids: number[]) {
  const docsToDelete: FixedFindResponse<any> = await data.find({
    fields: ["_id", "_rev"],
    selector: { _id: { $in: ids } }
  })

  const deletePromise = docsToDelete.docs.map(doc => {
    return data.remove(doc) // <-- HERE TSC SHOUTS AT ME about `doc`
  })
  const deletion = await Promise.all(deletePromise)
  return deletion
}