如何编写使用枚举成员类型而不是枚举本身的泛型函数?

时间:2017-10-13 21:40:10

标签: typescript generics enums

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;

Playground

2 个答案:

答案 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;