gpt4 book ai didi

typescript - 为什么 `Error:(3, 1) TS1238:Unable to resolve signature of class decorator when called as an expression`错误

转载 作者:搜寻专家 更新时间:2023-10-30 21:14:09 27 4
gpt4 key购买 nike

我有以下装饰器:

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;

最佳答案

类内部使用属性装饰器definition ,而不是在类(class)之上。您的属性装饰器是应该放置类装饰器的地方。

可能会出现与签名相关的警告,因为 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;
}
}

关于typescript - 为什么 `Error:(3, 1) TS1238:Unable to resolve signature of class decorator when called as an expression`错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40717912/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com