2016-12-02 68 views
0

我有一个标签联合类型定义,并且有在我的代码,我想筛选到一个单一类型的位置。过滤联盟类型为单型

/* @flow */ 

type AbstractChange = { 
    base: string, 
}; 

type CreateChange = AbstractChange & { 
    kind: 'create', 
    createField: string, 
}; 

type UpdateChange = AbstractChange & { 
    kind: 'update', 
    updateField: string, 
}; 

type Change = CreateChange | UpdateChange; 

function test(changes: Change[]) { 
    let creates: CreateChange[] = changes.filter(c => c.kind === 'create'); 

    return creates; 
} 

遗憾的是,似乎没有被允许,我得到的错误:

19: function test(changes: Change[]) { 
         ^intersection. This type is incompatible with 7: 

type CreateChange = AbstractChange & {       
            ^object type 

Here's一试流链路是否有帮助。

回答

1

filter是不是足够聪明,明白这样的细化,但它也许明白类型

function maybeCreateChange(c: Change): ?CreateChange { 
    return c.kind === 'create' ? c : null 
} 

function test(changes: Change[]): CreateChange[] { 
    return changes.map(maybeCreateChange).filter(Boolean) 
}