在打字本文件中,它警告说:
注意,如果您的脚本目标小于ES5,则属性描述符将未定义。 如果方法装饰器返回一个值,它将用作该方法的属性描述符。 注意,如果脚本目标小于ES5,则返回值将被忽略。
因此,如果您想使用上面描述的装饰器的特性,我不清楚这对于不支持ES-5构建的低端浏览器意味着什么。
这两种情况中的哪一种是正确的。
a),如果您使用的是支持编译为ES5的Angular/TS版本,那么您就可以了。无论您是否使用这些特性,所有浏览器都将工作。
或
b),即使您的角度项目确实支持编译到ES5,那么为早期浏览器(例如,main-ES5 2015)制作的段塞也不支持上述特性。也就是说,要非常小心地使用它们。
发布于 2020-10-14 15:47:12
我无法给出任何关于角度的保证,但我可以提供一些保证,即在较旧的浏览器中,装饰器仍然工作良好。
作为类/方法作为参数调用的函数,装饰器在旧的浏览器上仍然工作得很好。例如,如果我有一个装饰师来简单地Object.freeze()我的类,那就很好了:
@Object.freeze
class Test {
}
Test.a = 5;此代码应在Object.freeze的任何浏览器上正确抛出错误,无论它是否支持属性描述符。(这是一个很弱的例子,因为描述符比冻结更老,但重点仍然存在。)
然而,访问器属性是被支持
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版本肯定会工作,因为它意味着装饰器绝对不依赖描述符行为。编译成较新版本的角不一定能保证在旧的浏览器上仍然工作,但我怀疑描述符是兼容性的限制因素,唯一真正不向后兼容的是getter/setter,它们对应于API的差异,所以我猜想在装饰器前面是安全的。
https://stackoverflow.com/questions/64356582
复制相似问题