将联合类型过滤为单一类型
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)
}
我定义了一个标记联合类型,在我的代码中有些地方我想将其过滤为单一类型。
/* @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)
}