1e41f4b71Sopenharmony_ci# ArkCompiler子系统变更说明 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci## cl.arkcompiler.1 TS编译的目标EcmaScript版本由ES2017切换至ES2021 4e41f4b71Sopenharmony_ci 5e41f4b71Sopenharmony_ci**访问级别** 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci其他 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci**变更原因** 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ciOpenHarmony SDK中TypeScript Compiler的target选项配置由ES2017切换至ES2021。 12e41f4b71Sopenharmony_ci 13e41f4b71Sopenharmony_ci**变更影响** 14e41f4b71Sopenharmony_ci 15e41f4b71Sopenharmony_ci对于极少数使用了部分ES2018-ES2021语法特性,但存在语法错误并添加`@ts-nocheck`或`@ts-ignore`注释的场景: 16e41f4b71Sopenharmony_ci 17e41f4b71Sopenharmony_ci变更前,可以通过注释屏蔽语法错误,编译通过; 18e41f4b71Sopenharmony_ci 19e41f4b71Sopenharmony_ci变更后,由于对这部分语法的检查校验增强,可能存在不兼容编译报错。 20e41f4b71Sopenharmony_ci 21e41f4b71Sopenharmony_ci 22e41f4b71Sopenharmony_ci**起始 API Level** 23e41f4b71Sopenharmony_ci 24e41f4b71Sopenharmony_ci9 25e41f4b71Sopenharmony_ci 26e41f4b71Sopenharmony_ci**变更发生版本** 27e41f4b71Sopenharmony_ci 28e41f4b71Sopenharmony_ciOpenHarmony SDK 5.0.0.19 29e41f4b71Sopenharmony_ci 30e41f4b71Sopenharmony_ci**变更的接口/组件** 31e41f4b71Sopenharmony_ci 32e41f4b71Sopenharmony_ci不涉及 33e41f4b71Sopenharmony_ci 34e41f4b71Sopenharmony_ci**适配指导** 35e41f4b71Sopenharmony_ci 36e41f4b71Sopenharmony_ci推荐删除`@ts-nocheck`和`@ts-ignore`注释,根据编译报错提示进行适配,例如: 37e41f4b71Sopenharmony_ci 38e41f4b71Sopenharmony_ci1. ES2018特性:Rest属性 39e41f4b71Sopenharmony_ci ``` 40e41f4b71Sopenharmony_ci // @ts-ignore 41e41f4b71Sopenharmony_ci const {a, ...remaning, b} = {a: 1, b: 2, c: 3, d: 4}; 42e41f4b71Sopenharmony_ci // ~~~~~~~~ 43e41f4b71Sopenharmony_ci // 被注释屏蔽的报错:A rest element must be last in a destructuring pattern. 44e41f4b71Sopenharmony_ci ``` 45e41f4b71Sopenharmony_ci 适配建议:删除`@ts-ignore`注释,将rest属性放在最后。 46e41f4b71Sopenharmony_ci ``` 47e41f4b71Sopenharmony_ci const {a, b, ...remaning} = {a: 1, b: 2, c: 3, d: 4}; 48e41f4b71Sopenharmony_ci ``` 49e41f4b71Sopenharmony_ci 50e41f4b71Sopenharmony_ci2. ES2020特性:可选链式调用 51e41f4b71Sopenharmony_ci ``` 52e41f4b71Sopenharmony_ci const object = { property: "hi" }; 53e41f4b71Sopenharmony_ci // @ts-ignore 54e41f4b71Sopenharmony_ci object?.property = "hello"; 55e41f4b71Sopenharmony_ci // ~~~~~~~~~~~~~ 56e41f4b71Sopenharmony_ci // 被屏蔽的报错:The left-hand side of an assignment expression may not be an optional property access. 57e41f4b71Sopenharmony_ci ``` 58e41f4b71Sopenharmony_ci 适配建议:删除`@ts-ignore`注释,先对`object`进行判空,再进行赋值操作。 59e41f4b71Sopenharmony_ci ``` 60e41f4b71Sopenharmony_ci const object = { property: "hi" }; 61e41f4b71Sopenharmony_ci if (object !== undefined) { 62e41f4b71Sopenharmony_ci object.property = "hello"; 63e41f4b71Sopenharmony_ci } 64e41f4b71Sopenharmony_ci ``` 65e41f4b71Sopenharmony_ci 66e41f4b71Sopenharmony_ci3. ES2020特性:空值合并操作符 67e41f4b71Sopenharmony_ci ``` 68e41f4b71Sopenharmony_ci // @ts-nocheck 69e41f4b71Sopenharmony_ci let a = null || undefined ?? "foo"; 70e41f4b71Sopenharmony_ci // ~~~~~~~~~~~~~~~~~ 71e41f4b71Sopenharmony_ci // 被屏蔽的报错:'||' and '??' operations cannot be mixed without parentheses. 72e41f4b71Sopenharmony_ci let b = true && undefined ?? "foo"; 73e41f4b71Sopenharmony_ci // ~~~~~~~~~~~~~~~~~ 74e41f4b71Sopenharmony_ci // 被屏蔽的报错:'&&' and '??' operations cannot be mixed without parentheses. 75e41f4b71Sopenharmony_ci ``` 76e41f4b71Sopenharmony_ci 适配建议:删除`@ts-nocheck`注释,加上括号以确保运算顺序符合预期。 77e41f4b71Sopenharmony_ci ``` 78e41f4b71Sopenharmony_ci let a = (null || undefined) ?? "foo"; 79e41f4b71Sopenharmony_ci let b = (true && undefined) ?? "foo"; 80e41f4b71Sopenharmony_ci ``` 81e41f4b71Sopenharmony_ci其他可能不兼容的场景同理,删除`@ts-nocheck`和`@ts-ignore`注释后根据编译报错提示修复即可。 82e41f4b71Sopenharmony_ci 83e41f4b71Sopenharmony_ci开发者也可在工程级别的build-profile.json5文件中配置targetESVersion为ES2017,来保持与变更前一致。