流程-“记住”如果X是真实的,则Y必须是真实的

时间:2019-04-17 10:17:45

标签: flowtype

是否可以使类似的内容顺畅运行?

const flag: boolean = false
const obj: ?string = flag ? "hello" : null

if (flag) {
  (obj: string) // Cannot cast `obj` to string because null or undefined is incompatible with string.
}

https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVBjOA7AzgFzAA8AuMAIzjhgFMBDbMAXjCjplxsxwLDnIBWZAPwEATgEtsAc2bEwwsACIAFjRjwlYMtgCuG9BKhgAFEQCUYAN6owp-kLDip086gC+QA

我有一个变量obj,如果flag为true,则有条件地设置它。我可以做些什么,使流程“记住”是否设置了flag==trueobj

1 个答案:

答案 0 :(得分:0)

如果愿意,可以进行转换,但是必须首先对所有其他类型进行测试。

还建议您为此创建一个自定义类型,但是我认为这不是必需的。

这是一个代码示例:

/* @flow */

type ObjectOrString = {}|string|null;

const x: boolean = false
const constObj:ObjectOrString = x ? "hello" : null
var obj:ObjectOrString = x ? "hello" : null

if ( obj && typeof obj === 'object' ) {
  let o = (obj:{});
}
if ( obj && typeof obj === 'string' ) {
  let o = (obj:string);
}

if ( constObj && typeof constObj === 'object' ) {
  let o = (constObj:{});
}
if ( constObj && typeof constObj === 'string' ) {
  let o = (constObj:string);
}

https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVAXAngBwKZgDyARgFZ4DGGhATgMoY0CWAdgOZgC8YA3gL4AfAM6NWbASwCuMGAG50FOCxFgAHgC4wxOHBh4Ahiy5go+mELypFyjGGsiSpdY8rV6o9sdVgA-GABEABZ4MnD+YJpSMqgAbvo0YHBkzmSutAzMntzefkEh8OGR0jDoTFBgABSJZGAAZLVg2Phw5UmkXJzcAORtrl1gAJS8qGBgerZwxhVt6vwD8nyoZZXV7fWNuHgtqx3dIpls-UM8I2N4E1Mz+2LzqItL5VX21DXrTVvlz467YD2pVEdhqNxokpl9knMFg8VuC1g13ttYT8utd2ICTsDzqDuBVYepUWxbvdUEA