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;
答案 0 :(得分:3)
kind
中列出了Kind.Apple
参数类型从Kind
扩展到T
的原因:
在调用表达式的类型参数推断期间推断出类型 对于类型参数,如果符合以下情况,则将其扩展为其扩展的文字类型:
- 对T的所有推论都是针对特定参数类型中的顶级出现的,并且
- T没有约束或其约束不包括原始或文字类型,
- T在推理过程中被修复,或者在返回类型的顶层没有出现T.
如果在第二个项目符号中提到,为通用参数returned
添加约束,它将开始推断特定的文字类型。这样做的代价是Kind
仅适用于enum Kind {
Apple,
Banana,
}
interface Wrapper<K> {
kind: K;
}
const returned = <K extends Kind>(kind: K): Wrapper<K> => ({
kind,
})
const theValue = returned(Kind.Apple);
const thisWorksNow: Wrapper<Kind.Apple> = theValue;
的子类型。
public ClassA{
ArrayList<ClassB> bClassObjectList;
...
<getters and setters>
}
public ClassB{
...
}
答案 1 :(得分:0)
您可以在调用returned
时明确指定通用类型:
enum Kind {
Apple,
Banana,
}
interface Wrapper<K> {
kind: K;
}
const returned = <K>(kind: K): Wrapper<K> => ({
kind,
})
const theValue = returned<Kind.Apple>(Kind.Apple);
const thisWorksNow: Wrapper<Kind.Apple> = theValue;