为什么Flow会以非预期的方式推断类型?

问题描述

我有这种代码

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);

在Flow中进行编译时,行B和C失败,因为它推断mapType的类型为MapType | string。为什么这样做呢?有办法改变吗?

我希望它像在Typescript上一样在A和B行上失败。


我可以这样做:

const mapType: MapType = context.mapType;

但是它有点超出目的,因为我被迫明确指定类型。另外,您不能在一个语句中“提取”多个属性,而我必须为每个语句指定类型。配置中是否有设置使其更像Typescript一样工作?

解决方法

您可以这样做 进行销毁时,可以指定类似的类型。 / * @流* /

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);