期待与工会的类型错误&交叉口

时间:2016-09-27 16:13:34

标签: javascript types flowtype discriminated-union

我正在使用the following type definitions inside of Flow's try tool,并且在使用嵌套在联盟中的交叉点时,我看到了一些奇怪的行为。

type Transition = SimpleTransition | BranchingTransition | LoopingTransition;

type SimpleTransition = {
  type: 'transition',
  next?: string
}

type BranchingTransition = SimpleTransition & {
  branch: Branch[] 
}

type LoopingTransition = SimpleTransition & {
  loop: Loop
}

type Branch = {
  to: string,
  when: string
}

type Loop = {
  limit: number 
}

当我尝试创建一个包含其某个联合类型的不匹配属性的Transition时,我期待看到类型错误。

let t: Transition = {
  type: 'transition',
  branch: false // <- expecting type error (boolean != Branch[])
}

我希望包含branch属性会导致类型检查器针对BranchingTransition检查此对象(然后找到booleanBranch[]之间的类型不匹配,但它似乎只算作具有无关属性的SimpleTransition

我想知道这是否只是因为SimpleTransition是它能够统一的第一个联合类型,但改变联合中类型的顺序似乎没有效果。

有趣的是,当我从联盟中删除SimpleTransition时,它的工作正常(although the error message is somewhat confusing)。有没有办法构建这些类型以防止出现此问题?

1 个答案:

答案 0 :(得分:0)

以来,流程表现正常
({
  type: 'transition',
  branch: false
}: SimpleTransition)

您可以使用$Exact类型(流量0.32 +)

缩小类型范围
type Transition = $Exact<SimpleTransition> | BranchingTransition | LoopingTransition;

或编写自己的等价物(Flow 0.31 - )

type Strict<T> = $Shape<T> & T;
type Transition = Strict<SimpleTransition> | BranchingTransition | LoopingTransition;