Как отобразить значение массива Firestore, определенное как FieldValue - PullRequest
0 голосов
/ 11 ноября 2019

Я немного застрял в том, как определить значение массива в моем интерфейсе TypeScript для документа Firestore, а также воспользоваться преимуществами FieldValue.arrayUnion (). Зависимости: TypeScript 3.7.2 и @ google-cloud / firestore 2.6.0.

т.е. Интерфейс включает ключ 'members', представляющий собой массив строк:

import * as firestore from "@google-cloud/firestore";

interface SomeDoc {
  members: string[] | firestore.FieldValue;
}

const foo: SomeDoc = {
  members: ["s"]
};

const bar = foo.members.includes("s") ? "does include" : "does not include";

Я могу успешно обновить значение, используя методы FieldUalue arrayUnion () и arrayRemove () из Firestore, что отлично. Однако TypeScript выдает следующую ошибку типа:

TypeScript error:
Property 'includes' does not exist on type 'string[] | FieldValue'.
  Property 'includes' does not exist on type 'FieldValue'.  TS2339

Кто-нибудь имеет какие-либо советы о том, как наилучшим образом определить этот вид значения?

1 Ответ

1 голос
/ 11 ноября 2019

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

Вы можете получить доступ только к тем членам, которые гарантированно входят во все составляющие типа объединения.

Итак, с вашим определением вы могли бы удовлетворить TS, охраняя так:

const bar = (foo.members as string[]).includes("s") ? "does include" : "does not include";

Обратите внимание, что это может вызвать ошибки во время выполнения, если вы защищаете что-то, что не является действительнымбазовый тип.

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