打字稿:使用装饰器时的类型推断

时间:2016-04-03 18:34:41

标签: javascript oop typescript decorator

我想知道为什么当我在类中使用Typescript中的装饰器或注释时。编译器无法推断出类的新类型。如果我不使用装饰器并使用旧方法在ES5中执行此操作(即手动调用装饰器),它显然有效。

例如,这里有一个显示问题的示例:

function decorate(Target: typeof Base): IExtendedBaseConstructor {
  return class extends Target implements IExtendedBase {
    public extendedtMethod(): number {
      return 3;
    }
  };
}

interface IBase {
  baseMethod(): number;
}

interface IExtendedBase extends Base {
  extendedtMethod(): number;
}

interface IExtendedBaseConstructor {
  new(): IExtendedBase;
}

@decorate
class Base implements IBase {
  public baseMethod(): number {
    return 5;
  }
}

const test = new Base();
test.baseMethod(); // OK
test.extendedtMethod(); // NOT OK, typescript think, Base is still Base but we decorated it.

使用较旧的方式,它可以工作:

class Base implements IBase {
  public baseMethod(): number {
    return 5;
  }
}

const ExtendedBase = decorate(Base);

const test = new ExtendedBase();
test.baseMethod(); // OK
test.extendedtMethod(); // OK

提前致谢。

1 个答案:

答案 0 :(得分:2)

现在这不起作用。 github上有一个pending issue,允许类装饰器改变类的类型。

我建议采用"旧方式"你提到这一点,直到实施。