在查看问题之后,似乎TS 应该支持带有装饰器的ES3,我有一个场景,我在typescript中有一个使用装饰器和目标ES5的现有代码库,但我现在需要显然支持IE6需要ES3。
现在根据: https://github.com/Microsoft/TypeScript/issues/4681
似乎应该支持ES3,但是如果我输出到目标ES3,我得到:
error TS1241: Unable to resolve signature of method decorator when called as an expression.
Supplied parameters do not match any signature of call target.
我得到0个错误,一切都在ES5中运行,所以你是否需要做任何事情才能让它在ES3中运行,或者只是不支持?
以下是问题的云9示例:
https://ide.c9.io/grofit/knockout-decorators-es3-example
只需在命令行上运行gulp
,如果将tsconfig目标更改为es5,它将起作用。
答案 0 :(得分:7)
看起来,当您定位ES3时,方法装饰器不受支持,或根本不受支持。不幸的是,您收到的错误消息并不是非常有用。看起来有关于错误消息的discussion。此外,我不清楚他们是否打算在针对ES3或完全支持时部分支持装饰器。
例如,如果您尝试使用面向ES3的方法装饰器:
function myMethodDecorator(target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<any>): TypedPropertyDescriptor<any> {
// do something
return descriptor;
};
class MyClass {
@myMethodDecorator
myMethod(arg: string) {
return "Message -- " + arg;
}
}
您收到报告的错误消息:
错误TS1241:当作为表达式调用时,无法解析方法装饰器的签名。 提供的参数与呼叫目标的任何签名都不匹配。
但是如果你试图应用一个属性描述符,尽管你将它应用于一个方法,编译器就可以了。这会编译目标ES3而不会出错:
function myPropertyDecorator(target: Object, propertyKey: string): void {
// something
};
class MyClass {
@myPropertyDecorator
myMethod(arg: string) {
return "Message -- " + arg;
}
}
但是,在使用方法装饰器时,可以通过以下方式将其编译为ES3:
let myMethodDecorator: any = function(target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<any>): TypedPropertyDescriptor<any> {
// do something
return descriptor;
};
class MyClass {
@myMethodDecorator
myMethod(arg: string) {
return "Message -- " + arg;
}
}