reactjs - 如何使用接口在 Flow 中键入函数参数
问题描述
我正在尝试实现一个包含选项列表并显示它们的 React 组件id
和name
. 我希望这个组件是可重用的,所以我定义了一个接口Option
来确保始终提供必填字段。
问题来了:如果我传递的任何类型的字段多于 2 { id, name, /* anything */}
,Flow 就会抱怨。不能像这样在 Flow 中使用接口吗?
这是最小的相关代码:
interface Option {
id: string,
name: string
}
const List = (options: Option[]) => {
options.forEach(o => null)
}
type ImplementsOption = {
id: string,
name: string,
description: string
}
const plans: ImplementsOption[] = []
List(plans)
错误:
无法调用绑定到,
List
因为属性1中缺少但存在于数组元素的 [2] 中。plans
options
description
Option
ImplementsOption
尝试铸造:
List((plans: Option[]))
还有类:
class ComplexOption implements Option {
id: string
name: string
}
const complexOptions: ComplexOption[] = []
List(complexOptions)
似乎没有任何效果!
已经有一个包含所有这些片段的游乐场。
解决方案
想象一下,我们有一个ImplementsOption
:列表[{ id: 'id', name: 'name', description: 'description' }, ...]
。现在我们将它传递给List
具有签名的函数Option[] => void
。这是完全有效的,List
因为ImplementOption
它是 的超类型Option
。但是,List
函数不能保证它不会修改传入的列表。因此,该函数可以Option
向列表中添加一个类型的元素,这对 a 有效Option[]
但对 a 无效ImplementsOption[]
。
要解决此问题,您可以键入plans
a $ReadOnlyArray<Option>
,它告诉 Flow 该List
函数不会修改元素(尝试 flow)。
推荐阅读
- react-native - 使用 react-native-paytm 时无法进行发布构建
- r - pROC 包中的 roc() 函数:控件和案例及其上下文的使用
- java - 无法将我的文本文件读取到我的数组中,并且我无法让我的平衡按钮工作。这里的初学者程序员......可以使用一些方向
- vue.js - 新行 (
) 会自动添加到样式表中 - eloqua - 使用 Rest Api 创建具有多个字段的 Eloqua 表单时出现 500 内部服务器错误
- solr - Solr 为不同的集合缩放多个实例和分片或多个 solr
- leaflet - 如何在非地理地图上显示vectorTile
- javascript - 在 Html 中打印 Json 数据
- java - OPenJPA: : 抛出异常时如何提交实体
- php - JSON解码多级?