Javascript 流-可能类型与联合类型不兼容
流代码可以是 使用flow,我有一个函数,它接受一个键值对对象并为它获取一个值——它获取的值应该是字符串、数字或布尔值Javascript 流-可能类型与联合类型不兼容,javascript,flowtype,Javascript,Flowtype,流代码可以是 使用flow,我有一个函数,它接受一个键值对对象并为它获取一个值——它获取的值应该是字符串、数字或布尔值 type ValueType = string | number | bool | null | void; type ObjectOfValues = {[string]: ValueType} function getValueFromObjectOfValues(objectOfValues: ObjectOfValues, name: string): ValueTy
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
具有typenumber
,从而打破了类型系统
要解决此问题,可以使用。您需要按以下方式更改您的类型:
type ObjectOfValues={+[string]:ValueType}
这大致意味着,如果您有一个类型为ObjectOfValues
的对象,那么您所知道的只是它的属性是ValueType
的某些子类型。这意味着当您从中读取时,您将得到一个ValueType
。但是Flow不允许您对它们进行写入,因为它不知道它们实际上是什么类型——只是它们是ValueType
的一个子类型