【问题标题】:Typescript ES7 descriptors with ES3 output?带有 ES3 输出的 Typescript ES7 描述符?
【发布时间】:2016-04-21 06:10:11
【问题描述】:

在查看问题后,似乎 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 即可。

【问题讨论】:

  • 你能提供代码吗?你试过tsc script.ts -t ES3吗?
  • 当然,我正在使用带有 es3 目标的 tsconfig 和 gulp typescript。我添加了一个指向显示问题的 cloud9 版本的链接。

标签: javascript typescript


【解决方案1】:

看起来当你以 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;
    }
}

【讨论】:

  • 出色的答案,我不在办公室自动取款机,所以当我回来时,我会验证并给你答案
  • 谢谢。我很想知道它是否适用于 IE6。查看发出的代码,它似乎依赖于Object.getOwnPropertyDescriptor()。因此,如果可能的话,您可能必须对这种方法进行填充。
  • hmm 所以我可以像你建议的那样使用上面的方法编译它,问题是它只是抱怨描述符是未定义的,所以当目标 es6 时它似乎没有传入描述符,所以没有什么可做的钩入方法中。在我的“真实”世界场景中,我还将 args 传递给装饰器,因此它包装了内部装饰器。奇怪的是在 ES5 目标中它输出并且使用相同的代码可以正常工作,所以输出中的某些内容必须关闭......我目前正在 FF 中测试我只计划在 IE6 中进行测试,当两个输出目标都在 FF 上工作时。跨度>
  • 这个周末我搞砸了,我发现了同样的事情。当为 es3 编译时,你会得到这样的一行:__decorate([log], MyClass.prototype, "myMethod");。以 es5 为目标时,您会得到 __decorate([log], MyClass.prototype, "myMethod", null);null 参数是唯一的区别,这会导致它失败。但实际上还有更严重的问题。转译后的输出仍然使用 ES3 中不存在的 Object.getOwnPropertyDescriptor(),并且在 IE 中填充有问题:github.com/es-shims/es5-shim#may-fail
  • 等一下……我想我有。将在几分钟后发布。
猜你喜欢
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2021-04-10
  • 2020-05-05
  • 2015-10-04
  • 2019-06-22
  • 2011-07-19
  • 1970-01-01
相关资源
最近更新 更多