如何设置模型类型 n pouchdb upsert?
How to set the model type n pouchdb upsert?
看来我找不到解决办法。使用 upsert on pouchdb 我得到 TS2345
和或 TS2339
.
我试过像 htis 一样使用它。
db.upsert('id', doc => {
doc.p = 'sample';
return doc;
});
但是在 doc.p
我得到 TS2339
Property 'p' does not exist on type '{} | IdMeta'
基于pouchdb-upsert/index。d.ts它有这个定义
upsert<Model>(docId: Core.DocumentId, diffFun: UpsertDiffCallback<Content & Model>): Promise<UpsertResponse>;
所以我尝试了这个
db.upsert<{ p: string }>('id', doc => {
doc.p = 'sample';
return doc;
});
但现在我得到 TS2345
和 TS2339
。这是错误
Argument of type '(doc: {} | Document<{ p: string; }>) => {} | Document<{ p: string; }>' is not assignable to parameter of type 'UpsertDiffCallback<{ p: string; }>'.
Type '{} | Document<{ p: string; }>' is not assignable to type 'false | "" | 0 | ({ p: string; } & Partial<IdMeta>) | null | undefined'.
Type '{}' is not assignable to type 'false | "" | 0 | ({ p: string; } & Partial<IdMeta>) | null | undefined'.
Type '{}' is not assignable to type '{ p: string; } & Partial<IdMeta>'.
Type '{}' is not assignable to type '{ p: string; }'.
Property 'p' is missing in type '{}'. (typescript-tide)
有人吗?拜托,谢谢。
更新
当我这样测试时:
public test() {
new PouchDB('test').upsert<{ p: string }>('id', doc => {
doc.p = 'test string';
return doc;
})
}
我得到这个:
Argument of type '(doc: Partial<Document<{ p: string; }>>) => Partial<Document<{ p: string; }>>' is not assignable to parameter of type 'UpsertDiffCallback<{ p: string; }>'.
Type 'Partial<Document<{ p: string;; }>>' is not assignable to type 'false | "" | 0 | ({ p: string; } & Partial<IdMeta>) | null | undefined'.
Type 'Partial<Document<{ p: string; }>>' is not assignable to type '{ p: string; } & Partial<IdMeta>'.
Type 'Partial<Document<{ p: string; }>>' is not assignable to type '{ p: string; }'.
Types of property 'p' are incompatible.
Type 'string | undefined' is not assignable to type 'string'.
Type 'undefined' is not assignable to type 'string'. (typescript-tide)
而如果我这样做:
public test2() {
new PouchDB<{ p: string }>('test').upsert('id', doc => {
doc.p = 'test string';
return doc;
})
}
我得到这个:
Argument of type '(doc: Partial<Document<{ p: string; }>>) => Partial<Document<{ p: string; }>>' is not assignable to parameter of type 'UpsertDiffCallback<{ p: string; } & Partial<Document<{ p: string; }>>>'.
Type 'Partial<Document<{ p: string; }>>' is not assignable to type 'false | "" | 0 | ({ p: string; } & Partial<Document<{ p: string; }>> & Partial<IdMeta>) | null | ...'.
Type 'Partial<Document<{ p: string; }>>' is not assignable to type '{ p: string; } & Partial<Document<{ p: string; }>> & Partial<IdMeta>'.
Type 'Partial<Document<{ p: string; }>>' is not assignable to type '{ p: string; }'.
Types of property 'p' are incompatible.
Type 'string | undefined' is not assignable to type 'string'.
Type 'undefined' is not assignable to type 'string'. (typescript-tide)
问题的根源在于,如果文档不存在,您的 diffFun
会收到参数 {}
,并且该类型没有任何字段。我已经提交了 pull request to DefinitelyTyped to change the argument type to Partial<Core.Document<Content & Model>>
, which will be more useful since it will allow you to assign to fields. (See 以了解在拉取请求被合并之前使用我修改过的声明的可能方式。)
但是,如果您使用带有必填字段的文档类型,例如 { p: string }
,您仍然无法在没有类型断言的情况下 return doc
,因为 TypeScript 仍然认为doc
只有一个可选的 属性。您可以将文档类型指定为 { p?: string }
,然后您的代码将编译无误。但是,如果您确实希望数据库中的所有文档都有 p
属性,那么使用 { p: string }
并让每个 diffFun
使用类型断言或 return一个新对象,因此提醒您在文档不存在的情况下需要初始化所有必需的属性。
看来我找不到解决办法。使用 upsert on pouchdb 我得到 TS2345
和或 TS2339
.
我试过像 htis 一样使用它。
db.upsert('id', doc => {
doc.p = 'sample';
return doc;
});
但是在 doc.p
我得到 TS2339
Property 'p' does not exist on type '{} | IdMeta'
基于pouchdb-upsert/index。d.ts它有这个定义
upsert<Model>(docId: Core.DocumentId, diffFun: UpsertDiffCallback<Content & Model>): Promise<UpsertResponse>;
所以我尝试了这个
db.upsert<{ p: string }>('id', doc => {
doc.p = 'sample';
return doc;
});
但现在我得到 TS2345
和 TS2339
。这是错误
Argument of type '(doc: {} | Document<{ p: string; }>) => {} | Document<{ p: string; }>' is not assignable to parameter of type 'UpsertDiffCallback<{ p: string; }>'.
Type '{} | Document<{ p: string; }>' is not assignable to type 'false | "" | 0 | ({ p: string; } & Partial<IdMeta>) | null | undefined'.
Type '{}' is not assignable to type 'false | "" | 0 | ({ p: string; } & Partial<IdMeta>) | null | undefined'.
Type '{}' is not assignable to type '{ p: string; } & Partial<IdMeta>'.
Type '{}' is not assignable to type '{ p: string; }'.
Property 'p' is missing in type '{}'. (typescript-tide)
有人吗?拜托,谢谢。
更新
当我这样测试时:
public test() {
new PouchDB('test').upsert<{ p: string }>('id', doc => {
doc.p = 'test string';
return doc;
})
}
我得到这个:
Argument of type '(doc: Partial<Document<{ p: string; }>>) => Partial<Document<{ p: string; }>>' is not assignable to parameter of type 'UpsertDiffCallback<{ p: string; }>'.
Type 'Partial<Document<{ p: string;; }>>' is not assignable to type 'false | "" | 0 | ({ p: string; } & Partial<IdMeta>) | null | undefined'.
Type 'Partial<Document<{ p: string; }>>' is not assignable to type '{ p: string; } & Partial<IdMeta>'.
Type 'Partial<Document<{ p: string; }>>' is not assignable to type '{ p: string; }'.
Types of property 'p' are incompatible.
Type 'string | undefined' is not assignable to type 'string'.
Type 'undefined' is not assignable to type 'string'. (typescript-tide)
而如果我这样做:
public test2() {
new PouchDB<{ p: string }>('test').upsert('id', doc => {
doc.p = 'test string';
return doc;
})
}
我得到这个:
Argument of type '(doc: Partial<Document<{ p: string; }>>) => Partial<Document<{ p: string; }>>' is not assignable to parameter of type 'UpsertDiffCallback<{ p: string; } & Partial<Document<{ p: string; }>>>'.
Type 'Partial<Document<{ p: string; }>>' is not assignable to type 'false | "" | 0 | ({ p: string; } & Partial<Document<{ p: string; }>> & Partial<IdMeta>) | null | ...'.
Type 'Partial<Document<{ p: string; }>>' is not assignable to type '{ p: string; } & Partial<Document<{ p: string; }>> & Partial<IdMeta>'.
Type 'Partial<Document<{ p: string; }>>' is not assignable to type '{ p: string; }'.
Types of property 'p' are incompatible.
Type 'string | undefined' is not assignable to type 'string'.
Type 'undefined' is not assignable to type 'string'. (typescript-tide)
问题的根源在于,如果文档不存在,您的 diffFun
会收到参数 {}
,并且该类型没有任何字段。我已经提交了 pull request to DefinitelyTyped to change the argument type to Partial<Core.Document<Content & Model>>
, which will be more useful since it will allow you to assign to fields. (See
但是,如果您使用带有必填字段的文档类型,例如 { p: string }
,您仍然无法在没有类型断言的情况下 return doc
,因为 TypeScript 仍然认为doc
只有一个可选的 属性。您可以将文档类型指定为 { p?: string }
,然后您的代码将编译无误。但是,如果您确实希望数据库中的所有文档都有 p
属性,那么使用 { p: string }
并让每个 diffFun
使用类型断言或 return一个新对象,因此提醒您在文档不存在的情况下需要初始化所有必需的属性。