带有ES3输出的Typescript ES7描述符?

时间:2016-01-15 15:36:55

标签: javascript typescript

在查看问题之后,似乎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,它将起作用。

1 个答案:

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