有没有办法实现一个只接受特定枚举值的泛型函数?:
type EnumType = { [i: string]: string|number }
function f <T extends EnumType> (value: /* value of T only */) {
// ...
}
假设我们有以下枚举:
enum Color {
Red = 'red',
Blue = 'blue'
}
enum DayOfWeek {
Sunday = 0,
Monday = 1,
// ...
}
之后,函数调用必须是类型安全的:
f<Color>(Color.Red) // Можно
f<Color>('sdf') // Компилятор говорит "нельзя"
f<Color>('red') // Тоже лучше не разрешать, хотя значение из Color
f<Color>(DayOfWeek.Sunday) // Нельзя.
我试过value: keyof T
了,但它没有按照我想要的方式工作:
// Пример, когда value: keyof T
f<Color>(Color.Red) // Нельзя
f<Color>('Red') // Можно, но 'Red' - это имя значения, а не само значение
我需要准确地传递枚举值,而不是它们的名字!它也没有帮助value: T
,因为这样你可以传递枚举本身,而不是它的单个值。
怎样成为?
结果应该是一个反应组件,具有以下道具:
- 枚举:枚举
- 值:枚举值
- onChange: (value: enum_value) => void
这样做是为了
- 替换枚举时,无需更改组件本身;
- 值不是字符串|数字,而是例如颜色