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