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。