心流问题似乎没有什么答案,但这里是:
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
属性是 bool 值。
目的是让流程了解如果conditional
为true
,则对象test
返回must包含 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/
关于javascript - FlowJS : How to use union types and boolean literals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45512807/