【问题标题】:Typescript adding methods with decorator type does not existTypescript 添加装饰器类型的方法不存在
【发布时间】:2018-02-03 17:13:05
【问题描述】:

我想创建一个装饰器,为类添加方法。

export function Deco() {
  return function<T extends { new (...args: any[]): {} }>(constructor: T) {
    constructor.prototype.someMethod = function() {

    };
  };
}


@Deco()
class Test {

}

问题是当我尝试调用添加的方法时,我收到打字稿错误:

属性 someMethod 在类型 Test 上不存在。

const test = new Test();

test.someMethod();

我该如何解决这个问题?

【问题讨论】:

  • 大概是因为您没有将装饰器的返回输入为T &amp; SomeMethodHaver 或其他任何内容。
  • 你能举个例子吗?

标签: typescript


【解决方案1】:

装饰器不能影响类型的结构。有一个简单的解决方法。使用类调用装饰器,并在函数内部使用您想要的方法创建派生类。该函数的结果将是新的“装饰”类,它将具有所有方法:

export function Deco() {
    return function <T extends { new(...args: any[]): {} }>(constructor: T) {
        return class extends constructor {
            someMethod() {

            }
        }
    };
}


let Test = Deco()(class {
    // Other stuff
});

const test = new Test();
test.someMethod();

【讨论】:

  • 我正在失去装饰器的简洁语法。
  • @undefined 是的,你会的,遗憾的是没有其他选择......反正现在
  • 请注意,将来可能会允许这样做。此外,not 使用装饰器语法的优点是您不会写一个从未被采用的已弃用提案。 TypeScript 最终将实现取代提案,呈现您的代码遗留问题。 Angular 用户会玩得很开心
  • @TitianCernicova-Dragomir 但现在,我可以将 Test 方法用作泛型类型,但它不起作用。
  • @AluanHaddad 替代方案是什么?它是 Angular 使用的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 2015-10-23
  • 2014-04-08
相关资源
最近更新 更多