如何映射定义为FieldValue

时间:2019-11-10 23:55:57

标签: typescript google-cloud-firestore

对于在Firestore文档的TypeScript界面​​中如何定义数组值,我还有些困惑,同时还利用了FieldValue.arrayUnion()。依赖关系:TypeScript 3.7.2和@ google-cloud / firestore 2.6.0。

即。该界面包括一个“成员”键,该键是一个字符串数组:

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";

我可以使用Firestore的FieldValue arrayUnion()和arrayRemove()方法成功更新值,这很棒。但是,TypeScript会引发以下类型错误:

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

有人对如何最好地定义这种价值有任何提示吗?

1 个答案:

答案 0 :(得分:1)

TypeScript允许您指定联合中给定的任何一种类型,但不允许您在没有先使用type guard to differentiate the type的情况下读出这些类型中的任何一种。该部分说:

  

您只能访问保证属于联合体类型的所有组成部分的成员。

因此,按照您的定义,您可以通过这样的防护来满足TS:

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

请注意,如果您保护的不是真正的基础类型,则可能会导致运行时错误。