如果我使用这样的东西
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 {
}
一切正常:T0.p1是协变的,没有错误。
但是。如果我需要一个类型数组
作为参数type T0 = {p0: string, +p1?: string};
type T1 = {p0: string, p1: string};
function F0(a: T0) {}
function F1(a: T1) {
F0(a);
}
它抱怨'Covariant属性type T0 = {p0: string, +p1?: string};
type T1 = {p0: string, p1: string};
function F0(a: T0[]) {}
function F1(a: T1[]) {
F0(a);
}
与不变使用不兼容'。
我不知道为什么会发生
答案 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);
}