实现接口的TypeScript装饰器声明

时间:2017-04-18 00:38:12

标签: typescript

我尝试了几种不同的方法在TypeScript中声明一个装饰器函数,使装饰类实现一个接口。像这样:

@validated
class Foo {

}

let f = new Foo();
let isValid = f.checkValidation();

鉴于上述情况,我希望我能做到这样的事情:

let ValidatedFoo = validated(Foo);
let vf = new ValidatedFoo();
let isValid2 = vf.checkValidation();

但最后一行被标记为错误(“Foo”类型上不存在“属性'checkValidation'。”。

以下 工作的意义在于它不会产生错误:

{{1}}

有没有办法制定装饰器声明,以便第一个用法示例不会产生错误?

1 个答案:

答案 0 :(得分:1)

我不认为您可以修复它,以便装饰器改变编译器对Foo类的看法。
装饰器在运行时工作而不是编译时间,因此当您实例化Foo时,编译器会看到Foo

我可以想到以下三个选项:

(1)施放实例:

let f = new Foo() as Foo & IValidatable;
let isValid = f.checkValidation();

(2)将班级投射到十字路口:

interface FooConstructor {
    new (): Foo & IValidatable;
}

let f = new (Foo as FooConstructor)();
let isValid = f.checkValidation();

(3)使用工厂功能:

function fooFactory(): Foo & IValidatable {
    return new Foo() as Foo & IValidatable;
}

let f = fooFactory();
let isValid = f.checkValidation();

code in playground