Flow中的联合数组类型。类型A中缺少属性,但类型B中存在

时间:2019-02-21 15:25:12

标签: javascript flowtype

如何告诉流程我正在使用一种或另一种类型?

这是我的问题的一个例子:

/* @flow */

type Student = {
  role: string,
};

type Teacher = {
  role: string,
  title: string
};

const teachersArray: Array<Teacher> = [{role: 'teacher', title: 'mr' }];
const studentsArray: Array<Student> = [{role: 'student'}];

let dataArray: Array<Student | Teacher> = [];

let containerType = 'course'

if (containerType === 'course') {
  dataArray = teachersArray 
} else {
  dataArray = studentsArray
}

console.log(dataArray[0].title) // Cannot get `dataArray[0].title` because property `title` is missing in `Student` [1].

这里是try flow url

我希望能够使用相同的dataArray,但是流程不知道我正在使用哪个。

1 个答案:

答案 0 :(得分:0)

使用传播语法会强制Flow以其他方式检查类型。这不会引发任何错误:

if (containerType === 'course') {
  dataArray = [...teachersArray]
} else {
  dataArray = [...studentsArray]
}

但是,Flow对于此处的错误是正确的:

dataArray[0].title

由于dataArray的类型为Array<Student|Teacher>,因此无法确定title属性是否将在dataArray的第一个元素中定义。