【发布时间】:2020-09-27 18:28:45
【问题描述】:
给定一些enum MyEnum {ONE, TWO},我想写一个叫做like的函数
useMyFun(MyEnum, MyEnum.ONE);
我没有正确输入。现在我有类似以下的内容
type StringKeyOf<T> = Extract<keyof T, string>;
type EnumNumber<E> = Record<StringKeyOf<E>, number>;
function useMyFun<E extends EnumNumber<E>, V extends number=number> (
anEnum: E,
initialState: number) : {value: V, setValue: (v: V) => void}
{
const [value, setValue] = useState<V>(initialState as V);
//.... more stuff using both arguments omitted
return {value, setValue};
}
它是一个 react-hook,但这并不重要,因为你只需要编译它就是一个 dummy
function useState<V>(initialState: V) {
const result: [V, (v: V) => void] = [initialState, v => { }];
return result;
}
它可以工作(使用当前的打字稿版本),但它也允许我调用useMyFun(MyEnum, -1),这是错误的。请注意,我只关心上面的枚举,即具有默认数值、没有指定值且没有 const 修饰符的枚举。
*我还需要返回类型为value: MyEnum 而不是number。
我知道MyEnum的运行时值是{0: 'ONE', 1: 'TWO', ONE: '0', TWO: '1'},也就是说上面的输入实际上是错误的。然而,这是编译第一个参数的唯一方法。处理MyEnum 时的第二个参数实际上应该是0 | 1,但我无法让它工作。
我真的需要枚举对象和函数中的值。 有人能把类型弄对吗?
【问题讨论】:
-
你是否试图让函数的第二个参数只允许来自枚举的特定值?
-
您在使用枚举方面投入了多少?
-
@Jacquesジャック不,我需要在结果中提供所有枚举值以填充选择(上面未显示)。
-
@rob3c 在这里,枚举最好,因为不像
'ONE' | 'TWO',它们提供了所有值的列表,这正是我所需要的。 -
@maaartinus 我不同意他们在这里是最好的,因为您已经在问题中遇到了参数值限制的重大限制。但是,您似乎已经预先决定了什么是最好的,所以我将留给您。祝你好运!
标签: typescript enums type-inference typescript-generics