流程-创建“一个或另一个”属性

时间:2019-04-08 05:22:49

标签: javascript flowtype union-types

我正在尝试为具有基本属性和“一个或另一个”属性的对象创建类型。我尝试使用 union intersection 类型来实现此目的,但是我的知识有限,而且似乎无法弄清楚。

我希望Flow可以看到第一个属性,并推断不应允许另一个属性(当前,我什至无法获得允许任何一个的流)。

我的尝试

.affix-box {
  position: absolute;
  width: 200px;
  height: 100px;
  background-color: green;
  -webkit-transform: translate(-50%, -50%);
  -moz-transform: translate(-50%, -50%);
  -ms-transform: translate(-50%, -50%);
  -o-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
}

Try It

1 个答案:

答案 0 :(得分:0)

在Flow中,当前默认情况下对象是不精确的(尽管团队已经表明这种行为可以改变)。这意味着打字

const teacher: Teacher = {
  name: 'Alexa',
  age: 41,
  teacherId: 2,
  studentId: 3
}

完全有效,因为它具有三个必需的属性nameageteacherId。有关更多信息,请参见width subtyping

要让Flow针对其他属性发出警告,您将需要使用精确的对象(用{| ... |}表示)。 Flow现在会抱怨同时使用studentIdteacherId

type Base = {|
    name: string,
    age: number
|}

type Teacher = {|
    ...Base,
    teacherId: number,
|}

type Student = {|
    ...Base,
    studentId: number
|}

type Person = Student | Teacher;

const person: Person = {
    name: "John",
    age: 20,
    studentId: 000,
    teacherId: 111
} // Fails

Try Flow