流程问题似乎没有多少答案,但是可以这样:
type Base = {
foo: string,
bar: string
}
type Derived1 = Base & {
conditional: false
}
type Derived2 = Base & {
conditional: true,
baz: string
}
type One = {
foo: string,
bar: string,
conditional: boolean
}
type Two = One & {
baz: string
}
type Return1 = Derived1 | Derived2 // fails
type Return2 = One | Two // works, but not desired
function test(conditional: boolean): Return1 {
return {
foo: "foo",
bar: "bar",
conditional,
...conditional ? {baz: "baz"} : {}
}
}
返回值
test
最好是Derived*
类型之一(Return1
而不是Return2
),其中conditional
属性是布尔文字。目的是让流程理解如果
conditional
是true
,则对象test
返回的必须包含baz
,反之亦然。这不可能吗?
最佳答案
Flow不够智能,无法为您解决。您必须执行以下操作:
function test(conditional: boolean): Return1 {
const base = {
foo: "foo",
bar: "bar",
}
if (!conditional) {
return Object.assign({}, base, { conditional });
} else {
const result: Derived2 = Object.assign({}, base, { conditional }, {baz: "baz"});
return result;
}
}
此处更多信息:https://flow.org/blog/2016/07/01/New-Unions-Intersections/