Javascript 为什么流以意外的方式推断类型?
我有这样的代码:Javascript 为什么流以意外的方式推断类型?,javascript,enums,flowtype,string-literals,Javascript,Enums,Flowtype,String Literals,我有这样的代码: export type MapType = "AdventureMap" | "GuidebookMap"; type MapContext = {| mapType: MapType |} const context: MapContext = { mapType: "GuidebookMap" }; const { mapType } = context; // A: no error in this
export type MapType = "AdventureMap" | "GuidebookMap";
type MapContext = {|
mapType: MapType
|}
const context: MapContext = { mapType: "GuidebookMap" };
const { mapType } = context;
// A: no error in this line
if (mapType === "ABC-INVALID") {}
function fun(value: MapType) {
// B: error in this line
if (value === "123-INVALID") {}
}
// C: error in this line
fun(mapType);
在流中编译时,行B和C失败,因为它推断mapType
的类型是mapType | string
。为什么会这样?有办法改变吗
我希望它在A行和B行失败,就像在Typescript上一样
我可以这样做:
const-mapType:mapType=context.mapType代码>
但这有点超出了目的,因为我被迫显式地指定类型。此外,不能在一条语句中“提取”多个属性,我必须为每个属性指定类型。配置中是否有设置使其更像Typescript?您可以这样做
在分解结构时,可以指定这样的类型。
/*@flow*/
export type MapType = "AdventureMap" | "GuidebookMap";
type MapContext = {|
mapType: MapType
|}
const context: MapContext = { mapType: "GuidebookMap" };
const { mapType }:{
mapType: MapType
} = context;
// A: no error in this line
if (mapType === "ABC-INVALID") {}
function fun(value: MapType) {
// B: error in this line
if (value === "123-INVALID") {}
}
// C: error in this line
fun(mapType);
是的,这是可行的,但并不能真正回答Flow为什么会这样做的问题。或者在这方面是否有一个设置使其行为类似于Typescript。