Как вызвать Transaction.update, используя строго типизированный тип UpdateData - PullRequest
0 голосов
/ 15 апреля 2020

Рассмотрим метод update(documentRef, dataOrField, …preconditionOrValues) → {Transaction}.

Мне нужно иметь возможность передавать несколько пар (FieldPath, Value), потому что мне нужно обновить несколько полей одновременно. Можно написать что-то вроде этого:

txn.update(docRef,
  'field1', value1,
  'field2', value2
);

Typescript предлагает тип UpdateData :

  /**
   * Update data (for use with `DocumentReference.update()`) consists of field
   * paths (e.g. 'foo' or 'foo.baz') mapped to values. Fields that contain dots
   * reference nested fields within the document.
   */
  export type UpdateData = {[fieldPath: string]: any};

и подпись метода updateData объявлена as:

    /**
     * Updates fields in the document referred to by the provided
     * `DocumentReference`. The update will fail if applied to a document that
     * does not exist.
     *
     * Nested fields can be updated by providing dot-separated field path
     * strings.
     *
     * @param documentRef A reference to the document to be updated.
     * @param data An object containing the fields and values with which to
     * update the document.
     * @param precondition A Precondition to enforce on this update.
     * @return This `Transaction` instance. Used for chaining method calls.
     */
    update(documentRef: DocumentReference<any>, data: UpdateData,
           precondition?: Precondition): Transaction;

Теперь представьте, что у меня есть куча полевых обновлений, например:

  const fieldUpdates: FirebaseFirestore.UpdateData[] = [
    { ['field1']: value1 },
    { ['field2']: value2 },
  ];

Как я могу передать это методу update? Следующее:

txn.update(docRef, ...fieldUpdates);

не удается с:

Expected at least 2 arguments, but got 1 or more.ts(2557)
firestore.d.ts(378, 49): An argument for 'data' was not provided.

1 Ответ

2 голосов
/ 15 апреля 2020

Просто передайте один объект с именами и значениями полей для обновления.

txn.update(docRef, {
    field1: value1,
    field2: value2
})

В TypeScript {[fieldPath: string]: any} означает «объект со свойствами, которые должны быть строками, и их значения могут быть что-нибудь". В этом случае их ключи являются путями полей для обновления.

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