我已经归纳出以下情况。类型推断不能按我期望的那样工作,我在注释中内嵌了三个错误。
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; }
我不清楚这为什么不起作用,因为它似乎相对简单。也许我的方法存在根本缺陷?