angular - 如何解决 typescript / firestore 项目中类型“{}”问题上的属性不存在?
问题描述
以下是我的打字稿项目中的一些代码:
admin.firestore().collection('posts').doc(postId).get().then((data) => {
let likesCount = data.data()?.likesCount || 0;
let likes = data.data()?.likes || [];
let updateData = {};
if (action == 'like') {
updateData['likesCount'] = ++likesCount;
updateData[`likes.${userId}`] = true;
} else {
updateData['likesCount'] = --likesCount;
updateData[`likes.${userId}`] = false;
}
admin.firestore().collection('posts').doc(postId).update(updateData).then(() => {
response.status(200).send('Done');
}).catch((err) => {
response.status(err.code).send(err.message);
});
}).catch((err) => {
response.status(err.code).send(err.message);
});
我正在从教程中复制它,但是当我尝试在 if & else 块中分配值时出现错误。
这是我收到的错误消息:
元素隐式具有“任何”类型,因为类型“likesCount”的表达式不能用于索引类型“{}”。类型“{}”上不存在属性“likesCount”。
元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“{}”。在“{}”类型上找不到带有“字符串”类型参数的索引签名。
我尝试创建一个界面并使用如下所示:
interface UpdateData {
likesCount: number,
likes: string
}
let updateData = {} as UpdateData;
但这只会给我一个这样的错误:
元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“更新数据”。在“UpdateData”类型上找不到具有“字符串”类型参数的索引签名。
另外,我认为使用此接口的问题是,与我从 firestore 获取的数据相关联的值不止这两个值,因此我仍然希望在更新这两个值后该数据仍然存在。
有人可以告诉我如何解决这个问题吗?
解决方案
我相信您通常会遇到 TypeScript 类的问题,而不是 firebase。那么,为什么不试试我的下一个解决方案呢?
export class UpdateData {
constructor(){
this.likes = {};
}
likesCount!: number;
likes!: {
[key: string]: boolean;
}
}
然后在获取数据之后
let updateData = new UpdateData();
updateData.likesCount = action == 'like' ? ++likesCount : --likesCount;
updateData.likes[`${userId}`] = action == 'like';
console.log(updateData);
为简单起见,PS 只是使用条件语句而不是 if-else 块,但是,您的块应该可以正常工作。
you can find here an online working example as well: https://www.typescriptlang.org/play?#code/KYDwDg9gTgLgBAYwDYEMDOa4FUwBMUzAAiBKcA3gLABQcdiEAdmjFAK4IzQAUAlFbXpCYACwCWaAHRIxAa2CYAvBQC+AbhpCVm+jPloAwhDaMYAQgBccRmwC2AI2BQNgunoWWKOoXQDa8gE8rFigxRgBzAF0rewgIJGAURhctGm1qGgB6TNw7WwC4fBgUGgT4FE4xJjhlAHJ3WpcyuHdDY1MauABGJuB4NjQnAElcTtqUewQugCYAZkaaUr64NjwCYlJOxmAAd2w1whJivhcaVaKN4uk5BSMTeGUKmCrGGrqGuAB+OABqH9a7h0rABaYEA9owFzndZHFDXfS+AAGABJyANhrgVIjIp0ni83nB6jcFhlqAgmGh4sBpBBwtxoYdSLw1EA
希望这会有所帮助!
推荐阅读
- gitlab - gitlab中项目和子组之间的区别
- java - 无法解析方法“getData()”
- sql - 我有 2 列 V_DATE 和 OTP.... V_DATE 24 小时后我想设置 OTP 列 =0
- javascript - Stenciljs @Method 不工作
- java - 必须如何处理 ServerSOAPFaultException?它与处理 SOAPFaultException 有何不同?
- dart - angulardart中的两种方式绑定和监听器
- java - 获取 HashMap 中所有值的大小
> - c - C - execvp 不使用有效输入
- html - How to position an element relative to a specific background image object?
- css - 背景颜色超过背景图像 - 原因是什么?