Javascript 流-可能类型与联合类型不兼容

Javascript 流-可能类型与联合类型不兼容,javascript,flowtype,Javascript,Flowtype,流代码可以是 使用flow,我有一个函数,它接受一个键值对对象并为它获取一个值——它获取的值应该是字符串、数字或布尔值 type ValueType = string | number | bool | null | void; type ObjectOfValues = {[string]: ValueType} function getValueFromObjectOfValues(objectOfValues: ObjectOfValues, name: string): ValueTy

流代码可以是

使用flow,我有一个函数,它接受一个键值对对象并为它获取一个值——它获取的值应该是字符串、数字或布尔值

type ValueType =  string | number | bool | null | void;
type ObjectOfValues = {[string]: ValueType}
function getValueFromObjectOfValues(objectOfValues: ObjectOfValues, name: string): ValueType {
  return objectOfValues[name];
}
我定义了一些对象类型,其属性可能是
字符串:

type SomeValueWithNullableString = {
  someProperty: ?string
}
然后,我创建一个函数,该函数采用我的特定对象类型并调用该函数以从中获取值:

function getValue (someObject: SomeValueWithNullableString) {
  return getValueFromObjectOfValues(someObject, 'someProperty');
}
这将导致流错误:

类型ObjectOfValues={[string]:ValueType} ^布尔型。此类型与someProperty的预期参数类型不兼容: ?字符串^string 2:类型ObjectOfValues= {[string]:ValueType} ^号码。此类型与预期的参数类型9:someProperty不兼容: ?字符串^string


我做错了什么?

此代码的问题是对象是可变的,因此
getValueFromObjectOfValues
可以合法地执行
objectOfValues.someProperty=5

如果Flow允许这种子类型关系,那么原始调用方认为自己拥有一个对象,其中
someProperty
具有type
?string
,现在将拥有一个对象,其中
someProperty
具有type
number
,从而打破了类型系统

要解决此问题,可以使用。您需要按以下方式更改您的类型:

type ObjectOfValues={+[string]:ValueType}

这大致意味着,如果您有一个类型为
ObjectOfValues
的对象,那么您所知道的只是它的属性是
ValueType
的某些子类型。这意味着当您从中读取时,您将得到一个
ValueType
。但是Flow不允许您对它们进行写入,因为它不知道它们实际上是什么类型——只是它们是
ValueType
的一个子类型