我正在使用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
检查此对象(然后找到boolean
和Branch[]
之间的类型不匹配,但它似乎只算作具有无关属性的SimpleTransition
。
我想知道这是否只是因为SimpleTransition
是它能够统一的第一个联合类型,但改变联合中类型的顺序似乎没有效果。
有趣的是,当我从联盟中删除SimpleTransition
时,它的工作正常(although the error message is somewhat confusing)。有没有办法构建这些类型以防止出现此问题?
答案 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;