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