无法弄清楚如何从使用类型参数创建的通用类型中删除属性以恢复原始类型

时间:2019-04-16 21:17:39

标签: typescript

使用休息类型从通用类型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开头的等效内容的方法吗?

0 个答案:

没有答案