Атрибут Promise.all () ошибки не может быть назначен параметру - PullRequest
0 голосов
/ 21 апреля 2020

У меня возникают трудности с выполнением множества обещаний. У меня есть следующая облачная функция

export const updateUser = functions.region('europe-west1').https.onCall(async(data, context) => {
    const userID : string = Authentication.authenticate(context);
    Validator.validateString('displayName', data['displayName']);
    Validator.validateString('photoURL', data['photoURL']);

    const userInfo = {
        displayName:data['displayName'],
        photoURL:data['photoURL'],
    };

    const userReference = await firestore.collection('users').doc(userID);
    const promises = [];
    promises.push(admin.auth().updateUser(userID, {displayName:userInfo.displayName, photoURL:userInfo.photoURL}));
    promises.push(userReference.update(userInfo));
    await Promise.all<admin.auth.UserRecord, FirebaseFirestore.WriteResult>(promises);
});

, но Promise.all<admin.auth.UserRecord, FirebaseFirestore.WriteResult>(promises); выдает следующую ошибку

Argument of type '(Promise<WriteResult> | Promise<UserRecord>)[]' is not assignable to parameter of type 'readonly [UserRecord | PromiseLike<UserRecord>, WriteResult | PromiseLike<WriteResult>]'.
  Type '(Promise<WriteResult> | Promise<UserRecord>)[]' is missing the following properties from type 'readonly [UserRecord | PromiseLike<UserRecord>, WriteResult | PromiseLike<WriteResult>]': 0, 1ts(2345)

Но почему? Я соответствовал возвращаемому типу обещаний. Что я делаю не так?

1 Ответ

1 голос
/ 21 апреля 2020

Похоже, что типы ваших обещаний теряются после того, как вы поместили sh их в массив promises, который по существу не типизирован (ни один тип не означает any в TypeScript).

В вашем В данном случае, даже неважно, что это за обещания, потому что вы ничего не делаете с ними, кроме как возвращаете их вызывающей стороне. Вызываемая функция автоматически сериализует их и отправляет обратно клиенту. Я предлагаю просто отказаться от типов и написать следующее:

return Promise.all(promises)

Обратите внимание, что на самом деле вы должны return обещание. Вы не можете просто await это. В противном случае клиент не получит никаких значений.

Если вы хотите сохранить типы, вам не следует помещать их в нетипизированный массив, например:

const p1 = admin.auth().updateUser(userID, {displayName:userInfo.displayName, photoURL:userInfo.photoURL}));
const p2 = userReference.update(userInfo));
return Promise.all<admin.auth.UserRecord, FirebaseFirestore.WriteResult>([p1, p2]);
...