将联合类型过滤为单一类型

Filter Union Type to Single Type

我定义了一个标记联合类型,在我的代码中有些地方我想将其过滤为单一类型。

/* @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 如果有帮助,请尝试流程 link。

filter 不够聪明,无法理解这样的细化,但它可能理解类型

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

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