我尝试了几种不同的方法在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}}
有没有办法制定装饰器声明,以便第一个用法示例不会产生错误?
答案 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();