【发布时间】:2018-08-18 16:15:40
【问题描述】:
我有一个 dataSync 服务,它在 resolve 上返回 <WebPost> 类型的承诺。但是当我在我的组件中使用该服务时,打字稿一直将返回的数据称为类型对象,而不是类型 <WebPost>,这会破坏我的代码。
同样在 dataSync 服务resolve(data) line 中,当我将鼠标悬停在数据上时出现此错误
Argument of type '{ _id: string; caption: string; comments: [string]; likes: [string]; price: number; image: string; forUser: string; likesLength: 1; commentsLength: 1; isLiked: boolean; }' is not assignable to parameter of type 'WebPost | PromiseLike<WebPost>'.
我该如何解决这个问题?
这是我的组件中的方法
getPostFromUrl() {
this.route.params.subscribe(params => {
const id = params['id'];
this.dataSyncService.getPostData(id).then(data => {
this.data._id = id;
this.data.caption = data.caption;
this.data.comments = data.comments;
this.data.likes = data.likes;
this.data.price = data.price;
this.data.image = data.image;
this.data.forUser = data.forUser;
this.data.isLiked = data.isLiked;
this.data.likesLength = data.likesLength;
this.isData = true;
});
});
}
这里是数据同步服务
getPostDataP(id): Promise<WebPost> {
return new Promise<WebPost>((resolve, reject) => {
this.authService.getPostP(id).subscribe(d => {
if (d.success) {
const data = {
_id: '',
caption: d.data.caption,
comments: d.data.comments,
likes: d.data.likes,
price: d.data.price,
image: d.data.imageUrl,
forUser: d.data.forUser,
likesLength: d.data.likes.length,
commentsLength: d.data.comments.length,
isLiked: d.data.isLiked
};
resolve(data);
} else {
reject();
}
});
});
}
这里是 webPost 类型
export interface WebPost {
_id: string;
image: string;
forUser: string;
price: number;
likes: [string];
comments: [object];
caption: string;
likesLength: number;
commentsLength: number;
likessLength: number;
isLiked: boolean;
}
【问题讨论】:
-
您的界面有一个
likessLength属性,该属性未在您的getPostDataP函数中设置。 -
我刚删了,还是不行
-
当我在 StackBlitz 中尝试时似乎可以工作?确保删除
likessLength而不是likesLength -
在您的
WebPost接口声明中,在likes和comments中,我不认为[string]和[object]是正确的语法。如果您希望它们成为字符串数组/对象数组,那么您应该改用string[]和object[] -
问题是在dataSyncService中声明数据对象时,我没有添加类型。在我做了
const data: WebPost = {}之后。之后就可以了,谢谢
标签: angular typescript types promise observable