【发布时间】:2021-10-19 05:48:04
【问题描述】:
我正在添加一个具有以下结构的 Select 组件。
type Option = {
value: string | number
label: string;
icon?: string
}
type SelectProps = {
labelKey?: string;
iconKey?: string;
valueKe?: string;
options: Option[]
}
function Select({
labelKey = 'label',
iconKey = 'icon',
valueKey= 'value',
groupBy = 'groupBy',
options// need to type Option
}: SelectProps) {
// some logic to render options
// options.map(option => (<li key={option[valueKey]}>{option[labelKey]}</li>))
}
这里,options 是一系列选项,我试图让用户灵活地提供用于标签、图标等的键,这样用户就不需要一直映射数据。
目前,Option 类型具有硬编码键,例如 label、value、icon,但我想根据传递给 labelKey、valueKey、iconKey 等的值创建此类型.
例如,如果用户传递了labelKey="name" 属性,那么Option 类型应该允许以下数据:
[ {
name: 'Product',
value: 'product',
icon: 'product'
}]
到目前为止,我已经尝试了以下实现,但它将所有键的类型设置为字符串。
type OptionKeys = {labelKey: string, valueKey: string, iconKey: string}
type Option<T extends OptionKeys> = {
[label in T["labelKey" | "valueKey" | "iconKey"]]: string // all the types are string
}
type SelectProps<T extends OptionKeys = {
labelKey: 'label',
valueKey: 'value',
iconKey: 'icon'
}> = {
labelKey?: string
valueKey?: string;
iconKey?: string;
options: Option<T>[]
}
这里,Option 的键具有 string 类型的值,但我想根据键定义类型。例如,如果键是labelKey,我希望它的值是number | string 等等。
我在这里看到的一个选项是通过使 Select 组件通用化来从外部接受 OptionType,但在这种情况下,我需要重构我的组件并希望暂时避免这种重构。
如何更新我的类型以处理这种情况?
【问题讨论】:
标签: reactjs typescript typescript-generics