我有以下装饰者:
export function MyClassDecorator(): PropertyDecorator {
return function (target: Function) {
Object.seal(target);
Object.seal(target.prototype);
}
}
我这样使用:
import {ClassDecorator} from "./class-decorator";
@MyClassDecorator()
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
但是,tsc
报告错误:
Error:(3, 1) TS1238:Unable to resolve signature of class decorator when called as an expression.
Supplied parameters do not match any signature of call target.
修复方法是将PropertyDecorator
更改为ClassDecorator
:
export function MyClassDecorator(): ClassDecorator {
然而,问题是PropertyDecorator
错误的原因?
以下是lib.d.ts
中声明类和属性装饰器的方法:
declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;
declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;
答案 0 :(得分:0)
属性装饰器在类definition内使用,而不是在类上方使用。您的属性装饰器是放置类装饰器的地方。
可能会出现与签名有关的警告,因为ClassDecorator中的target
参数实际上必须是构造函数,而在PropertyDecorator中,它是一个更通用的对象。也许TS能够根据您放置装饰器的位置来获取差异。
例如,如果仅删除MyClassDecorator的返回类型,则TS将自动选择此函数的类型,然后一切正常:
function MyClassDecorator() {
return function (target: Function) {
Object.seal(target);
Object.seal(target.prototype);
};
}
@MyClassDecorator()
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}