首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否会在不支持ES5的浏览器中填充类型记录装饰器的下列功能

是否会在不支持ES5的浏览器中填充类型记录装饰器的下列功能
EN

Stack Overflow用户
提问于 2020-10-14 15:24:03
回答 1查看 78关注 0票数 0

打字本文件中,它警告说:

注意,如果您的脚本目标小于ES5,则属性描述符将未定义。 如果方法装饰器返回一个值,它将用作该方法的属性描述符。 注意,如果脚本目标小于ES5,则返回值将被忽略。

因此,如果您想使用上面描述的装饰器的特性,我不清楚这对于不支持ES-5构建的低端浏览器意味着什么。

这两种情况中的哪一种是正确的。

a),如果您使用的是支持编译为ES5的Angular/TS版本,那么您就可以了。无论您是否使用这些特性,所有浏览器都将工作。

b),即使您的角度项目确实支持编译到ES5,那么为早期浏览器(例如,main-ES5 2015)制作的段塞也不支持上述特性。也就是说,要非常小心地使用它们。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-14 15:47:12

我无法给出任何关于角度的保证,但我可以提供一些保证,即在较旧的浏览器中,装饰器仍然工作良好。

作为类/方法作为参数调用的函数,装饰器在旧的浏览器上仍然工作得很好。例如,如果我有一个装饰师来简单地Object.freeze()我的类,那就很好了:

代码语言:javascript
复制
@Object.freeze
class Test {
}
Test.a = 5;

此代码应在Object.freeze的任何浏览器上正确抛出错误,无论它是否支持属性描述符。(这是一个很弱的例子,因为描述符比冻结更老,但重点仍然存在。)

然而,访问器属性是被支持

代码语言:javascript
复制
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的差异,所以我猜想在装饰器前面是安全的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64356582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档