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,来保持与变更前一致。