我正在寻找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
。
另外,我应该提议改变DT类型吗?
感谢。
答案 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
}