reactjs - 打字稿:具有枚举类型参数的函数分配给具有字符串参数类型的回调
问题描述
我有一个带有回调的下拉组件onSelect:(option: string) => void
我在一个应用程序中将它用作排序选择器,其中选项是枚举类型:
enum SORT_OPTIONS {
LATEST = 'LATEST',
OLDEST = 'OLDEST'
}
const onSortSelect = (val: SORT_OPTIONS) => {...}
<MyDropdown onSelect={onSortSelect} ... />
打字稿抱怨:
Type '(val: SORT_OPTIONS) => void' is not assignable to type '(option: string) => void'.
Types of parameters 'val' and 'option' are incompatible.
Type 'string' is not assignable to type 'SORT_OPTIONS'. TS2322
这有点违反直觉但很有意义,因为在MyDropdown
一个字符串option
中将传递给onSortSelect
回调,这需要一个枚举值。
问题是在这里修复类型的最佳方法是什么?IMO 两个函数都输入正确,onSelect
应该接受任何字符串,因为MyDropdown
可以在任何上下文中使用。onSortSelect
应该只接受SORT_OPTIONS
。
目前我正在投射 onSortSelect 的类型:<MyDropdown onSelect={onSortSelect as (val:string) => void} ... />
但感觉很冗长
解决方案
您的回调处理onSelect:(option: string) => void
这意味着它将任何字符串传递给句柄,例如:hello
、、test
等等。
但是您const onSortSelect = (val: SORT_OPTIONS) => {...}
只需要字符串的子集:LATEST、OLDEST。
因此,TypeScript 警告您不能将整个集合传递给需要子集的函数。
要解决此问题,您需要将onSelect
处理程序更新为:
onSelect:(option: SORT_OPTIONS) => void
推荐阅读
- hugo - Hugo v0.55.x 弃用错误 - 零对象上的“.File.BaseFileName”
- mongodb - Mongo Query:如何使用 DBRef 进行 $lookup
- node.js - Johnny-Five,I2C,使用 ESP8266 控制多个温度传感器
- pentaho - Pentaho水壶将日期转换为unix
- bash - 通过 xargs 输入参数时命令失败,但直接输入参数时不会
- opencl - 使用 vloadn (opencl) 加载未分配的内存
- generics - (FS0193、FS1113)具有静态解析类型参数的 F# 向量类
- python - 如何删除一个工作簿的多个 Excel 工作表中的重复列?
- google-cloud-spanner - Spanner 是否支持某种递归查询?
- android - 如何在 recyclerview 中使用片段?