首页 > 解决方案 > 如何解决 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 获取的数据相关联的值不止这两个值,因此我仍然希望在更新这两个值后该数据仍然存在。

有人可以告诉我如何解决这个问题吗?

标签: angulartypescriptfirebasegoogle-cloud-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

希望这会有所帮助!


推荐阅读