提供具有列出字段的类型

Provide a type which has listed fields

我用 Flow 编写了一个函数,它接受 MyTypevalue 并且它只使用字段 foo: number:

const a = (value: MyType) => {
  return value.foo;
};

但是,我想让 MyType 与任何具有 foo: number 字段的类型一起工作,例如有这样的类型:

type A = {
  foo: number,
  baz: string,
};

type B = {
  foo: number,
  bar: number,
};

如何定义 MyType,以便它可以与 AB 一起使用,但也可以与具有 foo: number 的任何其他类型一起使用?

我试着用 $Shape<{ foo: number }> 来做,但没有用,因为当我提供 value: B 时,Flow 开始抛出错误。我也尝试这样做 A | B,但我得到了同样的错误,而且它不涵盖除 AB 之外的其他情况。我也考虑过泛型类型,但看起来它们在这里无济于事。

根据我在官方文档中看到的内容,您可以指定您要查找的参数需要特定类型的特定字段:

const a = (value: { foo: number }) => {
  return value.foo;
};

这将接受至少定义了字段“foo”(数字类型)的任何类型(A、B 或任何类型)。

但是,如果您只想让您的函数接受类型 A 或 B 作为参数,您可以使用以下方法:

const a = (value: A | B) => {
  return value.foo;
};