2017-07-30 35 views
0

为什么会发生此错误?如果我对单个对象(而不是数组)执行相同的操作,它将起作用。FlowJs - 从阵列<Concrete>转换为阵列时出错<Generic>

problem

编辑 OK,这里是文字与额外的测试。

//@flow 
type Generic = { 
    id: number, 
} 

type Concrete = { 
    id: number, 
    a: number, 
} 

//------test 1----------- 

function f(array: Array<Generic>) { } 

//'property `a` (Property not found in object type See also: function call)' 
var array: Array<Concrete> = [{ id: 1, a: 2 }] 
f(array) 

//------test 2------------ 
var a:Generic = { id: 1 } 
var b:Concrete = { id: 2, a: 3 } 

//OK 
a = b 
+0

请将截图中的代码记录为文本,以便将其复制并试用。 –

+0

@PavelZubkou请参阅帖子编辑 – eugenekr

回答

1

数组在JavaScript中是可变的,Flow承认这一事实。

得出了一个array参数的Array<Generic>约束f,你可能会推Generic类型的对象为array说法从内f。这会改变被全局变量array引用的数组对象,其定义为Array<Concrete>。因此未能同时满足这两个约束条件。

这取决于你的任务,但如果array参数的值不应该被改变,你可以输入它作为array: $ReadOnlyArray<Generic>。这将允许您通过Array<Concrete>作为参数而没有冲突,因为$ReadOnlyArray是一种不允许在数组上进行变异操作的类型。