如何解决在不支持ES5的浏览器中,TypeScript装饰器的以下功能会被填充吗? 在两种情况中,警告提示是正确的
注意如果您的脚本目标小于ES5,则属性描述符将是未定义的。
如果方法装饰器返回一个值,它将用作方法的属性描述符。
注意如果您的脚本目标小于ES5,则忽略返回值。
因此,如果您想使用上述装饰器的功能,那么对于不支持ES-5版本的低端浏览器意味着什么,我不清楚。
在两种情况中,警告提示是正确的。
a)如果您使用的是支持编译为ES5的Angular / TS版本,则可以。无论您是否正在使用这些功能,所有浏览器都将运行
或
b)即使您的角度项目确实支持编译到ES5,但为早期浏览器(例如main-es2015)制作的插件也不支持上述功能。即,在使用它们时要非常小心。
解决方法
我不能保证角度,但是我可以保证装饰器在较旧的浏览器中仍然可以正常工作。
将装饰器作为函数使用类/方法作为参数调用,在较旧的浏览器上仍然可以正常工作。例如,如果我有一个装饰器来简单地Object.freeze()
我的班级很好,
@Object.freeze
class Test {
}
Test.a = 5;
此代码应该在supports Object.freeze
的任何浏览器上正确引发错误,无论它是否支持属性描述符。 (这是一个非常弱的示例,因为描述符早于冻结,但要点仍然存在。)
但是访问器属性为supported as long as Object.defineProperty
is supported
function nonWritable(target: any,propertyKey: string | symbol,descriptor?: PropertyDescriptor): any{
return {
...descriptor,writable: false
}
}
class Test {
@nonWritable
field = 10;
}
const x = new Test();
x.field = 11;
这只会在支持描述符的浏览器中引发Attempted to assign to readonly property.
错误,较旧的浏览器仍会调用该描述符,但是第三个参数descriptor
将是undefined
,并且装饰器的返回值(一个新的描述符)被忽略。
这意味着可以编译到ES5的angular版本肯定可以使用,因为这意味着装饰器绝对不依赖描述符行为。可以编译到较新版本的Angular不一定能在旧版浏览器上正常运行,但我怀疑描述符是兼容性的限制因素,唯一不向下兼容的是{{ 1}},而这些将对应于API的不同,所以我猜测,您在装饰器方面会很安全。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。