使用构造枚举的通用类的类型错误

时间:2019-06-07 21:11:36

标签: typescript

我已经归纳出以下情况。类型推断不能按我期望的那样工作,我在注释中内嵌了三个错误。

enum Type { A = 'A', B = 'B' }

interface ThingA { type: Type.A; }
interface ThingB { type: Type.B; }

type Thing<T extends Type> =
  T extends Type.A ? ThingA :
  T extends Type.B ? ThingB :
  never;

class Wrapper<T extends Type> {
  type: T;

  constructor(thing: Thing<T>) {
    // Type 'Type' is not assignable to type 'T'
    this.type = thing.type;
  }
}

function run<T extends Type>(wrapper: Wrapper<T>): T {
  switch (wrapper.type) {
    // Argument of type 'Wrapper<T>' is not assignable to parameter of type 'Wrapper<Type.A>'.
    // Type 'T' is not assignable to type 'Type.A'.
    // Type 'Type' is not assignable to type 'Type.A'.
    case Type.A: return getTypeA(wrapper);

    // Same error as above but with Type.B
    case Type.B: return getTypeB(wrapper);
  }
}

function getTypeA(wrapper: Wrapper<Type.A>) { return wrapper.type; }
function getTypeB(wrapper: Wrapper<Type.B>) { return wrapper.type; }

我不清楚这为什么不起作用,因为它似乎相对简单。也许我的方法存在根本缺陷?

0 个答案:

没有答案