【问题标题】:Flowtype: Extend Array type parameterFlowtype:扩展数组类型参数
【发布时间】:2017-08-03 22:31:05
【问题描述】:

首先,如果我的措辞不正确,请原谅我,我对所有的打字术语都不是很熟悉。

我有两种类型:A 和B,其中B 是A 的扩展,如下所示:

type A = { a: string };
type B = { a: string, b: string };

断言B 类型的值符合A 类型可以正常工作:

const bar: B = { a: 'hello', b: 'world' };
(bar: A); // No problemo

但是当将值包装到数组中时,断言变坏了:

const bars: Array<B> = [bar]; // This is fine
(bars: Array<B>); // Also fine
(bars: Array<A>); // Breaks!!

我完全误解了什么吗?这是泛型问题、数组问题还是 Flow 中的错误?

流版本:v0.52.0

请在Flow亲自查看

【问题讨论】:

  • 您对此有何看法?类型 A = { a: string, b?: string }; type B = { a: string, b?: string };
  • @MarkoSavic 我不想改变类型 A 来解决这个问题。

标签: javascript flowtype


【解决方案1】:

这是因为Array&lt;T&gt; 中的类型参数T 是不变的——这意味着在考虑子类型关系时它不接受超类型或子类型。在此处查看有关方差的文档以获取更多信息:https://flow.org/en/docs/lang/variance/#toc-invariance

您正在寻找的是具有协变类型参数的数据结构。具体来说,您可能想改用$ReadOnlyArray&lt;T&gt;。

Try it

【讨论】:

  • 谢谢!不知道 $ReadOnlyArray,我想从现在开始我只会使用那个:D
  • 没问题!不过,ReadOnlyArray 不允许您对其进行变异。它可能不会在所有情况下都有用。
  • 我意识到这一点,我喜欢不变性:p。会有例外,但从现在开始,ReadOnlyArray 将是我的首选。
猜你喜欢
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2012-07-24
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
相关资源
最近更新 更多