【发布时间】:2018-03-26 02:09:31
【问题描述】:
TypeScript documentation on enums 说:
枚举成员也可以成为类型!
我想要一个函数,它接受一个作为枚举成员的通用值并使用特定枚举成员的类型。
我看到我可以使用枚举成员作为类型:
enum Kind {
Apple,
Banana,
}
type Example1 = Kind.Apple;
我可以在泛型类型上下文中使用枚举成员:
interface Wrapper<K> {
kind: K;
}
type Example2 = Wrapper<Kind.Apple>;
当我将枚举成员传递给函数时,它会失去它是特定枚举成员的事实,而是将其设为父枚举类型:
const returned = <K>(kind: K): Wrapper<K> => ({
kind,
})
const theValue = returned(Kind.Apple);
// Type 'Kind' is not assignable to type 'Kind.Apple'.
const butNot: Example2 = theValue;
【问题讨论】:
-
这是对类型推断的抱怨吗?如果是这样,您的期望可能有点高... :) 您始终可以手动传入泛型类型:
returned<Kind.Apple>(Kind.Apple)。 -
另一种解决方法是编写
const returned = <K extends Kind>(kind: K): Wrapper<K> => ({ kind, }),但这使得returned仅适用于Kind子类型
标签: typescript generics enums