Как решить Свойство не существует в вопросе типа '{}' в проекте машинописи / firestore? - PullRequest
0 голосов
/ 15 марта 2020

Ниже приведен код в моем проекте машинописного текста:

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 .

Вот сообщения об ошибках, которые я получаю:

Элемент неявно имеет тип 'any', потому что выражение типа 'likesCount' 'нельзя использовать для индексации типа '{}'. Свойство «likesCount» не существует для типа «{}».

Элемент неявно имеет тип «любой», поскольку выражение типа «строка» нельзя использовать для индексации типа «{}». Нет подписи индекса с параметром типа 'string' для типа '{}'.

Я попытался создать интерфейс и использовать его, как показано ниже:

interface UpdateData {
            likesCount: number,
            likes: string
        }

        let updateData = {} as UpdateData;

Но это просто дает мне такую ​​ошибку:

Элемент неявно имеет тип 'any', потому что выражение типа 'string' нельзя использовать для индексации типа 'UpdateData'. Нет подписи индекса с параметром типа 'string' для типа 'UpdateData'.

Кроме того, я думаю, что при использовании этого интерфейса проблема состоит в том, что с этими значениями * связано более двух этих значений. 1023 * данные , которые я получаю из хранилища, поэтому я все еще хочу, чтобы эти данные существовали после обновления этих двух значений.

Может кто-нибудь сказать, пожалуйста, как решить эту проблему? вопрос

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Я полагаю, что вы столкнулись с проблемой в целом с классами 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 в условия простоты, однако, ваши блоки должны работать только штраф

1008 * вы можете найти здесь онлайн рабочий пример, а также:. https://www.typescriptlang.org/play?#code / KYDwDg9gTgLgBAYwDYEMDOa4FUwBMUzAAiBKcA3gLABQcdiEAdmjFAK4IzQAUAlFbXpCYACwCWaAHRIxAa2CYAvBQC + AbhpCVm + jPloAwhDaMYAQgBccRmwC2AI2BQNgunoWWKOoXQDa8gE8rFigxRgBzAF0rewgIJGAURhctGm1qGgB6TNw7WwC4fBgUGgT4FE4xJjhlAHJ3WpcyuHdDY1MauABGJuB4NjQnAElcTtqUewQugCYAZkaaUr64NjwCYlJOxmAAd2w1whJivhcaVaKN4uk5BSMTeGUKmCrGGrqGuAB + OABqH9a7h0rABaYEA9owFzndZHFDXfS + AAGABJyANhrgVIjIp0ni83nB6jcFhlqAgmGh4sBpBBwtxoYdSLw1EA

Надеюсь, это поможет!

0 голосов
/ 16 марта 2020

Пожалуйста, попробуйте следующее:

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

Он объявляет, что у нас может быть свойство типа string и может использоваться как индексируемая подпись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...