不存在带有装饰器类型的 Typescript 添加方法

und*_*ned 5 typescript

我想创建一个向类添加方法的装饰器。

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

    };
  };
}


@Deco()
class Test {

}
Run Code Online (Sandbox Code Playgroud)

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

类型 Test 上不存在属性 someMethod。

const test = new Test();

test.someMethod();
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Tit*_*mir 5

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

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();
Run Code Online (Sandbox Code Playgroud)

  • 我正在失去装饰器的更清晰的语法。 (3认同)