typescript - Varför `Error:(3, 1) TS1238: Kan inte lösa signaturen för klassdekorator när den anropas som ett uttryck` fel
Jag har följande dekoratör:
export function MyClassDecorator(): PropertyDecorator {
return function (target: Function) {
Object.seal(target);
Object.seal(target.prototype);
}
}
Och jag använder det så här:
import {ClassDecorator} from "./class-decorator";
@MyClassDecorator()
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
Men tsc rapporterar ett fel:
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.
Lösningen skulle vara att ändra PropertyDecorator till ClassDecorator:
export function MyClassDecorator(): ClassDecorator {
Men frågan är varför felet med PropertyDecorator?
Här är hur klass- och egenskapsdekorerare deklareras i lib.d.ts:
declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;
declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;
Svar #1
Egendomsdekorerare används inuti klassdefinitionen, och inte ovanför klassen. Din egendomsdekorerare är där en klassdekorerare borde placeras.
Varningen relaterad till signaturer kan visas eftersom target-parametern i ClassDecorator faktiskt måste vara en konstruktionsfunktion, medan den i PropertyDecorator är ett mer allmänt objekt. Kanske kan TS upptäcka skillnaden baserat på var du placerar dekoratören.
Till exempel, om du bara tar bort returtypen för MyClassDecorator så plockar TS automatiskt upp typen för denna funktion och allt fungerar:
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;
}
}
