【问题标题】:How to resolve Property does not exist on type '{}' issue in typescript / firestore project?如何解决 typescript / firestore 项目中类型“{}”问题上的属性不存在?
【发布时间】:2020-03-15 20:52:10
【问题描述】:

以下是我的打字稿项目中的一些代码:

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”。

元素隐含地具有“任何”类型,因为类型的表达式 “字符串”不能用于索引类型“{}”。没有带有 a 的索引签名 在“{}”类型上找到“字符串”类型的参数。

我尝试过创建一个界面并使用如下所示:

interface UpdateData {
            likesCount: number,
            likes: string
        }

        let updateData = {} as UpdateData;

但这只会给我这样的错误:

元素隐含地具有“任何”类型,因为类型的表达式 'string' 不能用于索引类型 'UpdateData'。无索引 在类型上找到带有“字符串”类型参数的签名 '更新数据'。

另外,我认为使用此接口的问题是,与我从 firestore 获取的 data 相关联的值不止这 2 个,所以我仍然希望这些数据在更新这两个值后仍然存在。

谁能告诉我如何解决这个问题?

【问题讨论】:

    标签: angular typescript firebase google-cloud-firestore


    【解决方案1】:

    我相信您通常会遇到 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);
    

    附:就简单性而言,只是使用了条件语句而不是 if-else 块,但是,您的块应该可以正常工作。

    您也可以在这里找到一个在线工作示例:https://www.typescriptlang.org/play?#code/KYDwDg9gTgLgBAYwDYEMDOa4FUwBMUzAAiBKcA3gLABQcdiEAdmjFAK4IzQAUAlFbXpCYACwCWaAHRIxAa2CYAvBQC+AbhpCVm+jPloAwhDaMYAQgBccRmwC2AI2BQNgunoWWKOoXQDa8gE8rFigxRgBzAF0rewgIJGAURhctGm1qGgB6TNw7WwC4fBgUGgT4FE4xJjhlAHJ3WpcyuHdDY1MauABGJuB4NjQnAElcTtqUewQugCYAZkaaUr64NjwCYlJOxmAAd2w1whJivhcaVaKN4uk5BSMTeGUKmCrGGrqGuAB+OABqH9a7h0rABaYEA9owFzndZHFDXfS+AAGABJyANhrgVIjIp0ni83nB6jcFhlqAgmGh4sBpBBwtxoYdSLw1EA

    希望对您有所帮助!

    【讨论】:

      【解决方案2】:

      请尝试以下方法:

      interface UpdateData {
                  likesCount: number;
                  likes: string;
                  [key:any]: any;
              }
      

      它声明我们可以拥有一个字符串类型的属性,并且可以用作可索引的签名。

      【讨论】:

      • 感谢您的回答,我已尝试使用您的界面。 updateData['likesCount] 上的错误消失了,但现在updateData[likes.${userId}] 上出现了新错误:类型 'true' 不可分配给类型 'string |数字'。我尝试将 string|number 更改为布尔值,但这又会产生不同的错误。
      • 我已更新我的答案,我已将其更改为 any 以解决所有问题。但是,如果您了解自己的结构,则可以将其更改为多种数据类型的联合。
      猜你喜欢
      • 1970-01-01
      • 2016-09-07
      • 2019-06-27
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2018-08-17
      • 1970-01-01
      相关资源
      最近更新 更多