为什么`错误:(3,1)TS1238:当作为表达式`错误调用时,无法解析类装饰器的签名

时间:2016-11-21 10:27:12

标签: typescript

我有以下装饰者:

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;

1 个答案:

答案 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;
    }
}