使用休息类型从通用类型id
删除Doc
属性,然后将其添加到另一类型TContent
,如果{{ 1}}是通用类型参数。
我正在尝试为PouchDB创建 upsert 实用程序,该实用程序具有大致基于pouchdb-upsert的类型。从包装袋中获取文档会为您提供文档ID和修订ID以及文档内容,我想从文档中删除它们,仅将内容传递给我的更新回调。
我将在我的代码示例中重现并调整PouchDB API的相关部分,以使其保持独立,并防止与浏览器中的全局Document和Response类型冲突。
TContent
这可行:
TContent
第一个代码段中的标记行失败并显示:
类型'
type UpsertFn<TContent> = (old: TContent) => TContent; type Doc<TContent extends {}> = TContent & {_id: string}; interface Resp { ok: boolean; _id: string; } interface Database<TContent extends {}> { get(id: string): Promise<Doc<TContent>>; put(doc: Doc<TContent>): Promise<Resp> } async function upsert<TContent extends {}>( db: Database<TContent>, id: string, ) { const old = await db.get(id); const {_id: oldId, ...oldContent} = old; upsertFn(oldContent); // this is illegal }
'不能分配给类型'interface IFoo { bar: number; } async function test() { const db: Database<IFoo> = {} as any; const old = await db.get('aaa'); const {_id: oldId, ...oldFoo} = old; const foo: IFoo = oldFoo; }
'。
这对我来说似乎很奇怪,因为似乎Pick<Doc<TContent>, Exclude<keyof TContent, "_id">>
应该排除在TContent
的键集_id
中。
但更重要的是,我想要一种回到keyof Doc<TContent>
或以old
开头的等效内容的方法吗?