【发布时间】:2016-07-23 05:11:50
【问题描述】:
我想知道为什么当我在一个类的 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
提前致谢。
【问题讨论】:
-
这种模式有什么好处? this code 不是更容易理解吗?
-
你是对的。在这种情况下,这种模式是没有用的。但新的前端框架(如 angular2)选择使用装饰器而不是继承来声明新组件。
-
我编写了一个库,它向用户建议一个帮助器来创建类 API(其中注入了一些参数和有用的方法)。因此,我创建了一个提供功能的抽象 Api 类和一个通过
meta-data将 api 注册到我的框架中的装饰器。在这种情况下,我的用户必须这样做:import { AbstractAPI, Api } from 'myLib' @Api(...) class UserApi extends AbstractAPI {}我的 SO 问题也与此有关。如果我可以删除扩展并将所有内容合并到我的装饰器@Api中,它将减少最终用户的拼写错误。 -
哦,我明白了。谢谢!我很好奇。
标签: javascript oop typescript decorator