Typescript:使用装饰器时的类型推断

Cno*_*ode 6 javascript oop decorator typescript

我想知道为什么当我在类中使用 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.
Run Code Online (Sandbox Code Playgroud)

使用旧方法,它可以工作:

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

const ExtendedBase = decorate(Base);

const test = new ExtendedBase();
test.baseMethod(); // OK
test.extendedtMethod(); // OK
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Dav*_*ret 3

现在这行不通。github 上有一个待解决的问题,允许类装饰器更改类的类型。

我建议您采用您提到的“旧方法”,直到实施为止。