数组中的流协变性

时间:2017-07-27 13:48:39

标签: javascript flowtype

如果我使用这样的东西

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(features = "src/test/resources/toto")

public class BasicTest {

}

flow try

一切正常:T0.p1是协变的,没有错误。

但是。如果我需要一个类型数组

作为参数
type T0 = {p0: string, +p1?: string};
type T1 = {p0: string, p1: string};

function F0(a: T0) {}
function F1(a: T1) {
    F0(a);
}

flow try

它抱怨'Covariant属性type T0 = {p0: string, +p1?: string}; type T1 = {p0: string, p1: string}; function F0(a: T0[]) {} function F1(a: T1[]) { F0(a); } 与不变使用不兼容'。 我不知道为什么会发生

1 个答案:

答案 0 :(得分:1)

使用这种类型的签名,没有什么能阻止你做

function F0(a: T0[]) {
  a.push({ p0: "" });
}

F0的类型签名中有效,但在F1的类型签名中无效。

这为您提供了两个选项。

使用协变数组类型$ReadOnlyArray,因此Flow知道您不会向数组添加项目:

type T0 = {p0: string, +p1?: string};
type T1 = {p0: string, p1: string};

function F0(a: $ReadOnlyArray<T0>) {}
function F1(a: T1[]) {
    F0(a);
}

F1中的类型流入F0并使用泛型,因此Flow知道对象的实际类型。

type T0 = {p0: string, +p1?: string};
type T1 = {p0: string, p1: string};

function F0<T: T0>(a: Array<T>) {}
function F1(a: T1[]) {
    F0(a);
}